Annotation of embedaddon/quagga/ospfd/ospf_routemap.c, revision 1.1.1.2

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;
1.1.1.2 ! misho     446:   int32_t ret;
1.1       misho     447: 
                    448:   metric = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
1.1.1.2 ! misho     449:   ret = atoi (arg);
1.1       misho     450: 
1.1.1.2 ! misho     451:   if (ret >= 0)
        !           452:     {
        !           453:       *metric = (u_int32_t)ret;
        !           454:       return metric;
        !           455:     }
1.1       misho     456: 
                    457:   XFREE (MTYPE_ROUTE_MAP_COMPILED, metric);
                    458:   return NULL;
                    459: }
                    460: 
                    461: /* Free route map's compiled `set metric' value. */
                    462: static void
                    463: route_set_metric_free (void *rule)
                    464: {
                    465:   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
                    466: }
                    467: 
                    468: /* Set metric rule structure. */
                    469: struct route_map_rule_cmd route_set_metric_cmd =
                    470: {
                    471:   "metric",
                    472:   route_set_metric,
                    473:   route_set_metric_compile,
                    474:   route_set_metric_free,
                    475: };
                    476: 
                    477: /* `set metric-type TYPE' */
                    478: /* Set metric-type to attribute. */
                    479: static route_map_result_t
                    480: route_set_metric_type (void *rule, struct prefix *prefix,
                    481:                       route_map_object_t type, void *object)
                    482: {
                    483:   u_int32_t *metric_type;
                    484:   struct external_info *ei;
                    485: 
                    486:   if (type == RMAP_OSPF)
                    487:     {
                    488:       /* Fetch routemap's rule information. */
                    489:       metric_type = rule;
                    490:       ei = object;
                    491: 
                    492:       /* Set metric out value. */
                    493:       ei->route_map_set.metric_type = *metric_type;
                    494:     }
                    495:   return RMAP_OKAY;
                    496: }
                    497: 
                    498: /* set metric-type compilation. */
                    499: static void *
                    500: route_set_metric_type_compile (const char *arg)
                    501: {
                    502:   u_int32_t *metric_type;
                    503: 
                    504:   metric_type = XCALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (u_int32_t));
                    505:   if (strcmp (arg, "type-1") == 0)
                    506:     *metric_type = EXTERNAL_METRIC_TYPE_1;
                    507:   else if (strcmp (arg, "type-2") == 0)
                    508:     *metric_type = EXTERNAL_METRIC_TYPE_2;
                    509: 
                    510:   if (*metric_type == EXTERNAL_METRIC_TYPE_1 ||
                    511:       *metric_type == EXTERNAL_METRIC_TYPE_2)
                    512:     return metric_type;
                    513: 
                    514:   XFREE (MTYPE_ROUTE_MAP_COMPILED, metric_type);
                    515:   return NULL;
                    516: }
                    517: 
                    518: /* Free route map's compiled `set metric-type' value. */
                    519: static void
                    520: route_set_metric_type_free (void *rule)
                    521: {
                    522:   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
                    523: }
                    524: 
                    525: /* Set metric rule structure. */
                    526: struct route_map_rule_cmd route_set_metric_type_cmd =
                    527: {
                    528:   "metric-type",
                    529:   route_set_metric_type,
                    530:   route_set_metric_type_compile,
                    531:   route_set_metric_type_free,
                    532: };
                    533: 
                    534: DEFUN (match_ip_nexthop,
                    535:        match_ip_nexthop_cmd,
                    536:        "match ip next-hop (<1-199>|<1300-2699>|WORD)",
                    537:        MATCH_STR
                    538:        IP_STR
                    539:        "Match next-hop address of route\n"
                    540:        "IP access-list number\n"
                    541:        "IP access-list number (expanded range)\n"
                    542:        "IP access-list name\n")
                    543: {
                    544:   return ospf_route_match_add (vty, vty->index, "ip next-hop", argv[0]);
                    545: }
                    546: 
                    547: DEFUN (no_match_ip_nexthop,
                    548:        no_match_ip_nexthop_cmd,
                    549:        "no match ip next-hop",
                    550:        NO_STR
                    551:        MATCH_STR
                    552:        IP_STR
                    553:        "Match next-hop address of route\n")
                    554: {
                    555:   if (argc == 0)
                    556:     return ospf_route_match_delete (vty, vty->index, "ip next-hop", NULL);
                    557: 
                    558:   return ospf_route_match_delete (vty, vty->index, "ip next-hop", argv[0]);
                    559: }
                    560: 
                    561: ALIAS (no_match_ip_nexthop,
                    562:        no_match_ip_nexthop_val_cmd,
                    563:        "no match ip next-hop (<1-199>|<1300-2699>|WORD)",
                    564:        NO_STR
                    565:        MATCH_STR
                    566:        IP_STR
                    567:        "Match next-hop address of route\n"
                    568:        "IP access-list number\n"
                    569:        "IP access-list number (expanded range)\n"
                    570:        "IP access-list name\n")
                    571: 
                    572: DEFUN (match_ip_next_hop_prefix_list,
                    573:        match_ip_next_hop_prefix_list_cmd,
                    574:        "match ip next-hop prefix-list WORD",
                    575:        MATCH_STR
                    576:        IP_STR
                    577:        "Match next-hop address of route\n"
                    578:        "Match entries of prefix-lists\n"
                    579:        "IP prefix-list name\n")
                    580: {
                    581:   return ospf_route_match_add (vty, vty->index, "ip next-hop prefix-list",
                    582:                               argv[0]);
                    583: }
                    584: 
                    585: DEFUN (no_match_ip_next_hop_prefix_list,
                    586:        no_match_ip_next_hop_prefix_list_cmd,
                    587:        "no match ip next-hop prefix-list",
                    588:        NO_STR
                    589:        MATCH_STR
                    590:        IP_STR
                    591:        "Match next-hop address of route\n"
                    592:        "Match entries of prefix-lists\n")
                    593: {
                    594:   if (argc == 0)
                    595:     return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
                    596:                                    NULL);
                    597:   return ospf_route_match_delete (vty, vty->index, "ip next-hop prefix-list",
                    598:                                  argv[0]);
                    599: }
                    600: 
                    601: ALIAS (no_match_ip_next_hop_prefix_list,
                    602:        no_match_ip_next_hop_prefix_list_val_cmd,
                    603:        "no match ip next-hop prefix-list WORD",
                    604:        NO_STR
                    605:        MATCH_STR
                    606:        IP_STR
                    607:        "Match next-hop address of route\n"
                    608:        "Match entries of prefix-lists\n"
                    609:        "IP prefix-list name\n")
                    610: 
                    611: DEFUN (match_ip_address,
                    612:        match_ip_address_cmd,
                    613:        "match ip address (<1-199>|<1300-2699>|WORD)",
                    614:        MATCH_STR
                    615:        IP_STR
                    616:        "Match address of route\n"
                    617:        "IP access-list number\n"
                    618:        "IP access-list number (expanded range)\n"
                    619:        "IP access-list name\n")
                    620: {
                    621:   return ospf_route_match_add (vty, vty->index, "ip address", argv[0]);
                    622: }
                    623: 
                    624: DEFUN (no_match_ip_address,
                    625:        no_match_ip_address_cmd,
                    626:        "no match ip address",
                    627:        NO_STR
                    628:        MATCH_STR
                    629:        IP_STR
                    630:        "Match address of route\n")
                    631: {
                    632:   if (argc == 0)
                    633:     return ospf_route_match_delete (vty, vty->index, "ip address", NULL);
                    634: 
                    635:   return ospf_route_match_delete (vty, vty->index, "ip address", argv[0]);
                    636: }
                    637: 
                    638: ALIAS (no_match_ip_address,
                    639:        no_match_ip_address_val_cmd,
                    640:        "no match ip address (<1-199>|<1300-2699>|WORD)",
                    641:        NO_STR
                    642:        MATCH_STR
                    643:        IP_STR
                    644:        "Match address of route\n"
                    645:        "IP access-list number\n"
                    646:        "IP access-list number (expanded range)\n"
                    647:        "IP access-list name\n")
                    648: 
                    649: DEFUN (match_ip_address_prefix_list,
                    650:        match_ip_address_prefix_list_cmd,
                    651:        "match ip address prefix-list WORD",
                    652:        MATCH_STR
                    653:        IP_STR
                    654:        "Match address of route\n"
                    655:        "Match entries of prefix-lists\n"
                    656:        "IP prefix-list name\n")
                    657: {
                    658:   return ospf_route_match_add (vty, vty->index, "ip address prefix-list",
                    659:                               argv[0]);
                    660: }
                    661: 
                    662: DEFUN (no_match_ip_address_prefix_list,
                    663:        no_match_ip_address_prefix_list_cmd,
                    664:        "no match ip address prefix-list",
                    665:        NO_STR
                    666:        MATCH_STR
                    667:        IP_STR
                    668:        "Match address of route\n"
                    669:        "Match entries of prefix-lists\n")
                    670: {
                    671:   if (argc == 0)
                    672:     return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
                    673:                                    NULL);
                    674:   return ospf_route_match_delete (vty, vty->index, "ip address prefix-list",
                    675:                                  argv[0]);
                    676: }
                    677: 
                    678: ALIAS (no_match_ip_address_prefix_list,
                    679:        no_match_ip_address_prefix_list_val_cmd,
                    680:        "no match ip address prefix-list WORD",
                    681:        NO_STR
                    682:        MATCH_STR
                    683:        IP_STR
                    684:        "Match address of route\n"
                    685:        "Match entries of prefix-lists\n"
                    686:        "IP prefix-list name\n")
                    687: 
                    688: DEFUN (match_interface,
                    689:        match_interface_cmd,
                    690:        "match interface WORD",
                    691:        MATCH_STR
                    692:        "Match first hop interface of route\n"
                    693:        "Interface name\n")
                    694: {
                    695:   return ospf_route_match_add (vty, vty->index, "interface", argv[0]);
                    696: }
                    697: 
                    698: DEFUN (no_match_interface,
                    699:        no_match_interface_cmd,
                    700:        "no match interface",
                    701:        NO_STR
                    702:        MATCH_STR
                    703:        "Match first hop interface of route\n")
                    704: {
                    705:   if (argc == 0)
                    706:     return ospf_route_match_delete (vty, vty->index, "interface", NULL);
                    707: 
                    708:   return ospf_route_match_delete (vty, vty->index, "interface", argv[0]);
                    709: }
                    710: 
                    711: ALIAS (no_match_interface,
                    712:        no_match_interface_val_cmd,
                    713:        "no match interface WORD",
                    714:        NO_STR
                    715:        MATCH_STR
                    716:        "Match first hop interface of route\n"
                    717:        "Interface name\n")
                    718: 
                    719: DEFUN (set_metric,
                    720:        set_metric_cmd,
                    721:        "set metric <0-4294967295>",
                    722:        SET_STR
                    723:        "Metric value for destination routing protocol\n"
                    724:        "Metric value\n")
                    725: {
                    726:   return ospf_route_set_add (vty, vty->index, "metric", argv[0]);
                    727: }
                    728: 
                    729: DEFUN (no_set_metric,
                    730:        no_set_metric_cmd,
                    731:        "no set metric",
                    732:        NO_STR
                    733:        SET_STR
                    734:        "Metric value for destination routing protocol\n")
                    735: {
                    736:   if (argc == 0)
                    737:     return ospf_route_set_delete (vty, vty->index, "metric", NULL);
                    738: 
                    739:   return ospf_route_set_delete (vty, vty->index, "metric", argv[0]);
                    740: }
                    741: 
                    742: ALIAS (no_set_metric,
                    743:        no_set_metric_val_cmd,
                    744:        "no set metric <0-4294967295>",
                    745:        NO_STR
                    746:        SET_STR
                    747:        "Metric value for destination routing protocol\n"
                    748:        "Metric value\n")
                    749: 
                    750: DEFUN (set_metric_type,
                    751:        set_metric_type_cmd,
                    752:        "set metric-type (type-1|type-2)",
                    753:        SET_STR
                    754:        "Type of metric for destination routing protocol\n"
                    755:        "OSPF[6] external type 1 metric\n"
                    756:        "OSPF[6] external type 2 metric\n")
                    757: {
                    758:   if (strcmp (argv[0], "1") == 0)
                    759:     return ospf_route_set_add (vty, vty->index, "metric-type", "type-1");
                    760:   if (strcmp (argv[0], "2") == 0)
                    761:     return ospf_route_set_add (vty, vty->index, "metric-type", "type-2");
                    762: 
                    763:   return ospf_route_set_add (vty, vty->index, "metric-type", argv[0]);
                    764: }
                    765: 
                    766: DEFUN (no_set_metric_type,
                    767:        no_set_metric_type_cmd,
                    768:        "no set metric-type",
                    769:        NO_STR
                    770:        SET_STR
                    771:        "Type of metric for destination routing protocol\n")
                    772: {
                    773:   if (argc == 0)
                    774:     return ospf_route_set_delete (vty, vty->index, "metric-type", NULL);
                    775: 
                    776:   return ospf_route_set_delete (vty, vty->index, "metric-type", argv[0]);
                    777: }
                    778: 
                    779: ALIAS (no_set_metric_type,
                    780:        no_set_metric_type_val_cmd,
                    781:        "no set metric-type (type-1|type-2)",
                    782:        NO_STR
                    783:        SET_STR
                    784:        "Type of metric for destination routing protocol\n"
                    785:        "OSPF[6] external type 1 metric\n"
                    786:        "OSPF[6] external type 2 metric\n")
                    787: 
                    788: /* Route-map init */
                    789: void
                    790: ospf_route_map_init (void)
                    791: {
                    792:   route_map_init ();
                    793:   route_map_init_vty ();
                    794: 
                    795:   route_map_add_hook (ospf_route_map_update);
                    796:   route_map_delete_hook (ospf_route_map_update);
                    797:   route_map_event_hook (ospf_route_map_event);
                    798:   
                    799:   route_map_install_match (&route_match_ip_nexthop_cmd);
                    800:   route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd);
                    801:   route_map_install_match (&route_match_ip_address_cmd);
                    802:   route_map_install_match (&route_match_ip_address_prefix_list_cmd);
                    803:   route_map_install_match (&route_match_interface_cmd);
                    804: 
                    805:   route_map_install_set (&route_set_metric_cmd);
                    806:   route_map_install_set (&route_set_metric_type_cmd);
                    807: 
                    808:   install_element (RMAP_NODE, &match_ip_nexthop_cmd);
                    809:   install_element (RMAP_NODE, &no_match_ip_nexthop_cmd);
                    810:   install_element (RMAP_NODE, &no_match_ip_nexthop_val_cmd);
                    811:   install_element (RMAP_NODE, &match_ip_next_hop_prefix_list_cmd);
                    812:   install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_cmd);
                    813:   install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_val_cmd);
                    814:   install_element (RMAP_NODE, &match_ip_address_cmd);
                    815:   install_element (RMAP_NODE, &no_match_ip_address_cmd);
                    816:   install_element (RMAP_NODE, &no_match_ip_address_val_cmd);
                    817:   install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd);
                    818:   install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd);
                    819:   install_element (RMAP_NODE, &no_match_ip_address_prefix_list_val_cmd);
                    820:   install_element (RMAP_NODE, &match_interface_cmd);
                    821:   install_element (RMAP_NODE, &no_match_interface_cmd);
                    822:   install_element (RMAP_NODE, &no_match_interface_val_cmd);
                    823: 
                    824:   install_element (RMAP_NODE, &set_metric_cmd);
                    825:   install_element (RMAP_NODE, &no_set_metric_cmd);
                    826:   install_element (RMAP_NODE, &no_set_metric_val_cmd);
                    827:   install_element (RMAP_NODE, &set_metric_type_cmd);
                    828:   install_element (RMAP_NODE, &no_set_metric_type_cmd);
                    829:   install_element (RMAP_NODE, &no_set_metric_type_val_cmd);
                    830: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>