Annotation of embedaddon/quagga/zebra/zebra_routemap.c, revision 1.1.1.1

1.1       misho       1: /* zebra routemap.
                      2:  * Copyright (C) 2006 IBM Corporation
                      3:  *
                      4:  * This file is part of GNU Zebra.
                      5:  *
                      6:  * GNU Zebra is free software; you can redistribute it and/or modify it
                      7:  * under the terms of the GNU General Public License as published by the
                      8:  * Free Software Foundation; either version 2, or (at your option) any
                      9:  * later version.
                     10:  *
                     11:  * GNU Zebra is distributed in the hope that it will be useful, but
                     12:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     13:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     14:  * General Public License for more details.
                     15:  *
                     16:  * You should have received a copy of the GNU General Public License
                     17:  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
                     18:  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
                     19:  * 02111-1307, USA.  
                     20:  */
                     21: 
                     22: #include <zebra.h>
                     23: 
                     24: #include "memory.h"
                     25: #include "prefix.h"
                     26: #include "rib.h"
                     27: #include "routemap.h"
                     28: #include "command.h"
                     29: #include "filter.h"
                     30: #include "plist.h"
                     31: 
                     32: #include "zebra/zserv.h"
                     33: 
                     34: /* Add zebra route map rule */
                     35: static int
                     36: zebra_route_match_add(struct vty *vty, struct route_map_index *index,
                     37:                      const char *command, const char *arg)
                     38: {
                     39:   int ret;
                     40: 
                     41:   ret = route_map_add_match (index, command, arg);
                     42:   if (ret)
                     43:     {
                     44:       switch (ret)
                     45:        {
                     46:        case RMAP_RULE_MISSING:
                     47:          vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
                     48:          return CMD_WARNING;
                     49:        case RMAP_COMPILE_ERROR:
                     50:          vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
                     51:          return CMD_WARNING;
                     52:        }
                     53:     }
                     54:   return CMD_SUCCESS;
                     55: }
                     56: 
                     57: /* Delete zebra route map rule. */
                     58: static int
                     59: zebra_route_match_delete (struct vty *vty, struct route_map_index *index,
                     60:                        const char *command, const char *arg)
                     61: {
                     62:   int ret;
                     63: 
                     64:   ret = route_map_delete_match (index, command, arg);
                     65:   if (ret)
                     66:     {
                     67:       switch (ret)
                     68:        {
                     69:        case RMAP_RULE_MISSING:
                     70:          vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
                     71:          return CMD_WARNING;
                     72:        case RMAP_COMPILE_ERROR:
                     73:          vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
                     74:          return CMD_WARNING;
                     75:        }
                     76:     }
                     77:   return CMD_SUCCESS;
                     78: }
                     79: 
                     80: /* Add zebra route map rule. */
                     81: static int
                     82: zebra_route_set_add (struct vty *vty, struct route_map_index *index,
                     83:                   const char *command, const char *arg)
                     84: {
                     85:   int ret;
                     86: 
                     87:   ret = route_map_add_set (index, command, arg);
                     88:   if (ret)
                     89:     {
                     90:       switch (ret)
                     91:        {
                     92:        case RMAP_RULE_MISSING:
                     93:          vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
                     94:          return CMD_WARNING;
                     95:        case RMAP_COMPILE_ERROR:
                     96:          vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
                     97:          return CMD_WARNING;
                     98:        }
                     99:     }
                    100:   return CMD_SUCCESS;
                    101: }
                    102: 
                    103: /* Delete zebra route map rule. */
                    104: static int
                    105: zebra_route_set_delete (struct vty *vty, struct route_map_index *index,
                    106:                      const char *command, const char *arg)
                    107: {
                    108:   int ret;
                    109: 
                    110:   ret = route_map_delete_set (index, command, arg);
                    111:   if (ret)
                    112:     {
                    113:       switch (ret)
                    114:        {
                    115:        case RMAP_RULE_MISSING:
                    116:          vty_out (vty, "%% Can't find rule.%s", VTY_NEWLINE);
                    117:          return CMD_WARNING;
                    118:        case RMAP_COMPILE_ERROR:
                    119:          vty_out (vty, "%% Argument is malformed.%s", VTY_NEWLINE);
                    120:          return CMD_WARNING;
                    121:        }
                    122:     }
                    123:   return CMD_SUCCESS;
                    124: }
                    125: 
                    126: 
                    127: /* `match interface IFNAME' */
                    128: /* Match function return 1 if match is success else return zero. */
                    129: static route_map_result_t
                    130: route_match_interface (void *rule, struct prefix *prefix,
                    131:                       route_map_object_t type, void *object)
                    132: {
                    133:   struct nexthop *nexthop;
                    134:   char *ifname = rule;
                    135:   unsigned int ifindex;
                    136: 
                    137:   if (type == RMAP_ZEBRA)
                    138:     {
                    139:       if (strcasecmp(ifname, "any") == 0)
                    140:        return RMAP_MATCH;
                    141:       ifindex = ifname2ifindex(ifname);
                    142:       if (ifindex == 0)
                    143:        return RMAP_NOMATCH;
                    144:       nexthop = object;
                    145:       if (!nexthop)
                    146:        return RMAP_NOMATCH;
                    147:       if (nexthop->ifindex == ifindex)
                    148:        return RMAP_MATCH;
                    149:     }
                    150:   return RMAP_NOMATCH;
                    151: }
                    152: 
                    153: /* Route map `match interface' match statement. `arg' is IFNAME value */
                    154: static void *
                    155: route_match_interface_compile (const char *arg)
                    156: {
                    157:   return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
                    158: }
                    159: 
                    160: /* Free route map's compiled `match interface' value. */
                    161: static void
                    162: route_match_interface_free (void *rule)
                    163: {
                    164:   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
                    165: }
                    166: 
                    167: /* Route map commands for interface matching */
                    168: struct route_map_rule_cmd route_match_interface_cmd =
                    169: {
                    170:    "interface",
                    171:    route_match_interface,
                    172:    route_match_interface_compile,
                    173:    route_match_interface_free
                    174: };
                    175: 
                    176: DEFUN (match_interface,
                    177:        match_interface_cmd,
                    178:        "match interface WORD",
                    179:        MATCH_STR
                    180:        "match first hop interface of route\n"
                    181:        "Interface name\n")
                    182: {
                    183:   return zebra_route_match_add (vty, vty->index, "interface", argv[0]);
                    184: }
                    185: 
                    186: DEFUN (no_match_interface,
                    187:        no_match_interface_cmd,
                    188:        "no match interface",
                    189:        NO_STR
                    190:        MATCH_STR
                    191:        "Match first hop interface of route\n")
                    192: {
                    193:   if (argc == 0)
                    194:     return zebra_route_match_delete (vty, vty->index, "interface", NULL);
                    195: 
                    196:   return zebra_route_match_delete (vty, vty->index, "interface", argv[0]);
                    197: }
                    198: 
                    199: ALIAS (no_match_interface,
                    200:        no_match_interface_val_cmd,
                    201:        "no match interface WORD",
                    202:        NO_STR
                    203:        MATCH_STR
                    204:        "Match first hop interface of route\n"
                    205:        "Interface name\n")
                    206: 
                    207: DEFUN (match_ip_next_hop,
                    208:        match_ip_next_hop_cmd,
                    209:        "match ip next-hop (<1-199>|<1300-2699>|WORD)",
                    210:        MATCH_STR
                    211:        IP_STR
                    212:        "Match next-hop address of route\n"
                    213:        "IP access-list number\n"
                    214:        "IP access-list number (expanded range)\n"
                    215:        "IP Access-list name\n")
                    216: {
                    217:   return zebra_route_match_add (vty, vty->index, "ip next-hop", argv[0]);
                    218: }
                    219: 
                    220: DEFUN (no_match_ip_next_hop,
                    221:        no_match_ip_next_hop_cmd,
                    222:        "no match ip next-hop",
                    223:        NO_STR
                    224:        MATCH_STR
                    225:        IP_STR
                    226:        "Match next-hop address of route\n")
                    227: {
                    228:   if (argc == 0)
                    229:     return zebra_route_match_delete (vty, vty->index, "ip next-hop", NULL);
                    230: 
                    231:   return zebra_route_match_delete (vty, vty->index, "ip next-hop", argv[0]);
                    232: }
                    233: 
                    234: ALIAS (no_match_ip_next_hop,
                    235:        no_match_ip_next_hop_val_cmd,
                    236:        "no match ip next-hop (<1-199>|<1300-2699>|WORD)",
                    237:        NO_STR
                    238:        MATCH_STR
                    239:        IP_STR
                    240:        "Match next-hop address of route\n"
                    241:        "IP access-list number\n"
                    242:        "IP access-list number (expanded range)\n"
                    243:        "IP Access-list name\n")
                    244: 
                    245: DEFUN (match_ip_next_hop_prefix_list,
                    246:        match_ip_next_hop_prefix_list_cmd,
                    247:        "match ip next-hop prefix-list WORD",
                    248:        MATCH_STR
                    249:        IP_STR
                    250:        "Match next-hop address of route\n"
                    251:        "Match entries of prefix-lists\n"
                    252:        "IP prefix-list name\n")
                    253: {
                    254:   return zebra_route_match_add (vty, vty->index, "ip next-hop prefix-list", argv[0]);
                    255: }
                    256: 
                    257: DEFUN (no_match_ip_next_hop_prefix_list,
                    258:        no_match_ip_next_hop_prefix_list_cmd,
                    259:        "no match ip next-hop prefix-list",
                    260:        NO_STR
                    261:        MATCH_STR
                    262:        IP_STR
                    263:        "Match next-hop address of route\n"
                    264:        "Match entries of prefix-lists\n")
                    265: {
                    266:   if (argc == 0)
                    267:     return zebra_route_match_delete (vty, vty->index, "ip next-hop prefix-list", NULL);
                    268: 
                    269:   return zebra_route_match_delete (vty, vty->index, "ip next-hop prefix-list", argv[0]);
                    270: }
                    271: 
                    272: ALIAS (no_match_ip_next_hop_prefix_list,
                    273:        no_match_ip_next_hop_prefix_list_val_cmd,
                    274:        "no match ip next-hop prefix-list WORD",
                    275:        NO_STR
                    276:        MATCH_STR
                    277:        IP_STR
                    278:        "Match next-hop address of route\n"
                    279:        "Match entries of prefix-lists\n"
                    280:        "IP prefix-list name\n")
                    281: 
                    282: DEFUN (match_ip_address,
                    283:        match_ip_address_cmd,
                    284:        "match ip address (<1-199>|<1300-2699>|WORD)",
                    285:        MATCH_STR
                    286:        IP_STR
                    287:        "Match address of route\n"
                    288:        "IP access-list number\n"
                    289:        "IP access-list number (expanded range)\n"
                    290:        "IP Access-list name\n")
                    291: 
                    292: {
                    293:   return zebra_route_match_add (vty, vty->index, "ip address", argv[0]);
                    294: }
                    295: 
                    296: DEFUN (no_match_ip_address, 
                    297:        no_match_ip_address_cmd,
                    298:        "no match ip address",
                    299:        NO_STR
                    300:        MATCH_STR
                    301:        IP_STR
                    302:        "Match address of route\n")
                    303: {
                    304:   if (argc == 0)
                    305:     return zebra_route_match_delete (vty, vty->index, "ip address", NULL);
                    306: 
                    307:   return zebra_route_match_delete (vty, vty->index, "ip address", argv[0]);
                    308: }
                    309: 
                    310: ALIAS (no_match_ip_address,
                    311:        no_match_ip_address_val_cmd,
                    312:        "no match ip address (<1-199>|<1300-2699>|WORD)",
                    313:        NO_STR
                    314:        MATCH_STR
                    315:        IP_STR
                    316:        "Match address of route\n"
                    317:        "IP access-list number\n"
                    318:        "IP access-list number (expanded range)\n"
                    319:        "IP Access-list name\n")
                    320: 
                    321: DEFUN (match_ip_address_prefix_list, 
                    322:        match_ip_address_prefix_list_cmd,
                    323:        "match ip address prefix-list WORD",
                    324:        MATCH_STR
                    325:        IP_STR
                    326:        "Match address of route\n"
                    327:        "Match entries of prefix-lists\n"
                    328:        "IP prefix-list name\n")
                    329: {
                    330:   return zebra_route_match_add (vty, vty->index, "ip address prefix-list", argv[0]);
                    331: }
                    332: 
                    333: DEFUN (no_match_ip_address_prefix_list,
                    334:        no_match_ip_address_prefix_list_cmd,
                    335:        "no match ip address prefix-list",
                    336:        NO_STR
                    337:        MATCH_STR
                    338:        IP_STR
                    339:        "Match address of route\n"
                    340:        "Match entries of prefix-lists\n")
                    341: {
                    342:   if (argc == 0)
                    343:     return zebra_route_match_delete (vty, vty->index, "ip address prefix-list", NULL);
                    344: 
                    345:   return zebra_route_match_delete (vty, vty->index, "ip address prefix-list", argv[0]);
                    346: }
                    347: 
                    348: ALIAS (no_match_ip_address_prefix_list,
                    349:        no_match_ip_address_prefix_list_val_cmd,
                    350:        "no match ip address prefix-list WORD",
                    351:        NO_STR
                    352:        MATCH_STR
                    353:        IP_STR
                    354:        "Match address of route\n"
                    355:        "Match entries of prefix-lists\n"
                    356:        "IP prefix-list name\n")
                    357: 
                    358: /* set functions */
                    359: 
                    360: DEFUN (set_src,
                    361:        set_src_cmd,
                    362:        "set src A.B.C.D",
                    363:        SET_STR
                    364:        "src address for route\n"
                    365:        "src address\n")
                    366: {
                    367:   struct in_addr src;
                    368:   struct interface *pif;
                    369: 
                    370:   if (inet_pton(AF_INET, argv[0], &src) <= 0)
                    371:     {
                    372:       vty_out (vty, "%% not a local address%s", VTY_NEWLINE);
                    373:       return CMD_WARNING;
                    374:     }
                    375: 
                    376:     pif = if_lookup_exact_address (src);
                    377:     if (!pif)
                    378:       {
                    379:         vty_out (vty, "%% not a local address%s", VTY_NEWLINE);
                    380:         return CMD_WARNING;
                    381:       }
                    382:   return zebra_route_set_add (vty, vty->index, "src", argv[0]);
                    383: }
                    384: 
                    385: DEFUN (no_set_src,
                    386:        no_set_src_cmd,
                    387:        "no set src",
                    388:        NO_STR
                    389:        SET_STR
                    390:        "Source address for route\n")
                    391: {
                    392:   if (argc == 0)
                    393:     return zebra_route_set_delete (vty, vty->index, "src", NULL);
                    394: 
                    395:   return zebra_route_set_delete (vty, vty->index, "src", argv[0]);
                    396: }
                    397: 
                    398: ALIAS (no_set_src,
                    399:        no_set_src_val_cmd,
                    400:        "no set src (A.B.C.D)",
                    401:        NO_STR
                    402:        SET_STR
                    403:        "src address for route\n"
                    404:        "src address\n")
                    405: 
                    406: /*XXXXXXXXXXXXXXXXXXXXXXXXXXXX*/
                    407: 
                    408: /* `match ip next-hop IP_ACCESS_LIST' */
                    409: 
                    410: /* Match function return 1 if match is success else return zero. */
                    411: static route_map_result_t
                    412: route_match_ip_next_hop (void *rule, struct prefix *prefix,
                    413:                        route_map_object_t type, void *object)
                    414: {
                    415:   struct access_list *alist;
                    416:   struct nexthop *nexthop;
                    417:   struct prefix_ipv4 p;
                    418: 
                    419:   if (type == RMAP_ZEBRA)
                    420:     {
                    421:       nexthop = object;
                    422:       switch (nexthop->type) {
                    423:       case NEXTHOP_TYPE_IFINDEX:
                    424:       case NEXTHOP_TYPE_IFNAME:
                    425:       case NEXTHOP_TYPE_IPV4_IFINDEX:
                    426:       case NEXTHOP_TYPE_IPV4_IFNAME:
                    427:         if (nexthop->rtype != NEXTHOP_TYPE_IPV4)
                    428:                return RMAP_NOMATCH;
                    429:         p.family = AF_INET;
                    430:         p.prefix = nexthop->rgate.ipv4;
                    431:         p.prefixlen = IPV4_MAX_BITLEN;
                    432:         break;
                    433:       case NEXTHOP_TYPE_IPV4:
                    434:         p.family = AF_INET;
                    435:         p.prefix = nexthop->gate.ipv4;
                    436:         p.prefixlen = IPV4_MAX_BITLEN;
                    437:         break;
                    438:       default:
                    439:         return RMAP_NOMATCH;
                    440:       }
                    441:       alist = access_list_lookup (AFI_IP, (char *) rule);
                    442:       if (alist == NULL)
                    443:        return RMAP_NOMATCH;
                    444: 
                    445:       return (access_list_apply (alist, &p) == FILTER_DENY ?
                    446:              RMAP_NOMATCH : RMAP_MATCH);
                    447:     }
                    448:   return RMAP_NOMATCH;
                    449: }
                    450: 
                    451: /* Route map `ip next-hop' match statement.  `arg' should be
                    452:    access-list name. */
                    453: static void *
                    454: route_match_ip_next_hop_compile (const char *arg)
                    455: {
                    456:   return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
                    457: }
                    458: 
                    459: /* Free route map's compiled `. */
                    460: static void
                    461: route_match_ip_next_hop_free (void *rule)
                    462: {
                    463:   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
                    464: }
                    465: 
                    466: /* Route map commands for ip next-hop matching. */
                    467: static struct route_map_rule_cmd route_match_ip_next_hop_cmd =
                    468: {
                    469:   "ip next-hop",
                    470:   route_match_ip_next_hop,
                    471:   route_match_ip_next_hop_compile,
                    472:   route_match_ip_next_hop_free
                    473: };
                    474: 
                    475: /* `match ip next-hop prefix-list PREFIX_LIST' */
                    476: 
                    477: static route_map_result_t
                    478: route_match_ip_next_hop_prefix_list (void *rule, struct prefix *prefix,
                    479:                                     route_map_object_t type, void *object)
                    480: {
                    481:   struct prefix_list *plist;
                    482:   struct nexthop *nexthop;
                    483:   struct prefix_ipv4 p;
                    484: 
                    485:   if (type == RMAP_ZEBRA)
                    486:     {
                    487:       nexthop = object;
                    488:       switch (nexthop->type) {
                    489:       case NEXTHOP_TYPE_IFINDEX:
                    490:       case NEXTHOP_TYPE_IFNAME:
                    491:       case NEXTHOP_TYPE_IPV4_IFINDEX:
                    492:       case NEXTHOP_TYPE_IPV4_IFNAME:
                    493:         if (nexthop->rtype != NEXTHOP_TYPE_IPV4)
                    494:                return RMAP_NOMATCH;
                    495:         p.family = AF_INET;
                    496:         p.prefix = nexthop->rgate.ipv4;
                    497:         p.prefixlen = IPV4_MAX_BITLEN;
                    498:         break;
                    499:       case NEXTHOP_TYPE_IPV4:
                    500:         p.family = AF_INET;
                    501:         p.prefix = nexthop->gate.ipv4;
                    502:         p.prefixlen = IPV4_MAX_BITLEN;
                    503:         break;
                    504:       default:
                    505:         return RMAP_NOMATCH;
                    506:       }
                    507:       plist = prefix_list_lookup (AFI_IP, (char *) rule);
                    508:       if (plist == NULL)
                    509:         return RMAP_NOMATCH;
                    510: 
                    511:       return (prefix_list_apply (plist, &p) == PREFIX_DENY ?
                    512:               RMAP_NOMATCH : RMAP_MATCH);
                    513:     }
                    514:   return RMAP_NOMATCH;
                    515: }
                    516: 
                    517: static void *
                    518: route_match_ip_next_hop_prefix_list_compile (const char *arg)
                    519: {
                    520:   return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
                    521: }
                    522: 
                    523: static void
                    524: route_match_ip_next_hop_prefix_list_free (void *rule)
                    525: {
                    526:   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
                    527: }
                    528: 
                    529: static struct route_map_rule_cmd route_match_ip_next_hop_prefix_list_cmd =
                    530: {
                    531:   "ip next-hop prefix-list",
                    532:   route_match_ip_next_hop_prefix_list,
                    533:   route_match_ip_next_hop_prefix_list_compile,
                    534:   route_match_ip_next_hop_prefix_list_free
                    535: };
                    536: 
                    537: /* `match ip address IP_ACCESS_LIST' */
                    538: 
                    539: /* Match function should return 1 if match is success else return
                    540:    zero. */
                    541: static route_map_result_t
                    542: route_match_ip_address (void *rule, struct prefix *prefix, 
                    543:                        route_map_object_t type, void *object)
                    544: {
                    545:   struct access_list *alist;
                    546: 
                    547:   if (type == RMAP_ZEBRA)
                    548:     {
                    549:       alist = access_list_lookup (AFI_IP, (char *) rule);
                    550:       if (alist == NULL)
                    551:        return RMAP_NOMATCH;
                    552:     
                    553:       return (access_list_apply (alist, prefix) == FILTER_DENY ?
                    554:              RMAP_NOMATCH : RMAP_MATCH);
                    555:     }
                    556:   return RMAP_NOMATCH;
                    557: }
                    558: 
                    559: /* Route map `ip address' match statement.  `arg' should be
                    560:    access-list name. */
                    561: static void *
                    562: route_match_ip_address_compile (const char *arg)
                    563: {
                    564:   return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
                    565: }
                    566: 
                    567: /* Free route map's compiled `ip address' value. */
                    568: static void
                    569: route_match_ip_address_free (void *rule)
                    570: {
                    571:   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
                    572: }
                    573: 
                    574: /* Route map commands for ip address matching. */
                    575: static struct route_map_rule_cmd route_match_ip_address_cmd =
                    576: {
                    577:   "ip address",
                    578:   route_match_ip_address,
                    579:   route_match_ip_address_compile,
                    580:   route_match_ip_address_free
                    581: };
                    582: 
                    583: /* `match ip address prefix-list PREFIX_LIST' */
                    584: 
                    585: static route_map_result_t
                    586: route_match_ip_address_prefix_list (void *rule, struct prefix *prefix, 
                    587:                                    route_map_object_t type, void *object)
                    588: {
                    589:   struct prefix_list *plist;
                    590: 
                    591:   if (type == RMAP_ZEBRA)
                    592:     {
                    593:       plist = prefix_list_lookup (AFI_IP, (char *) rule);
                    594:       if (plist == NULL)
                    595:        return RMAP_NOMATCH;
                    596:     
                    597:       return (prefix_list_apply (plist, prefix) == PREFIX_DENY ?
                    598:              RMAP_NOMATCH : RMAP_MATCH);
                    599:     }
                    600:   return RMAP_NOMATCH;
                    601: }
                    602: 
                    603: static void *
                    604: route_match_ip_address_prefix_list_compile (const char *arg)
                    605: {
                    606:   return XSTRDUP (MTYPE_ROUTE_MAP_COMPILED, arg);
                    607: }
                    608: 
                    609: static void
                    610: route_match_ip_address_prefix_list_free (void *rule)
                    611: {
                    612:   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
                    613: }
                    614: 
                    615: static struct route_map_rule_cmd route_match_ip_address_prefix_list_cmd =
                    616: {
                    617:   "ip address prefix-list",
                    618:   route_match_ip_address_prefix_list,
                    619:   route_match_ip_address_prefix_list_compile,
                    620:   route_match_ip_address_prefix_list_free
                    621: };
                    622: 
                    623: 
                    624: /* `set src A.B.C.D' */
                    625: 
                    626: /* Set src. */
                    627: static route_map_result_t
                    628: route_set_src (void *rule, struct prefix *prefix, 
                    629:                  route_map_object_t type, void *object)
                    630: {
                    631:   if (type == RMAP_ZEBRA)
                    632:     {
                    633:       struct nexthop *nexthop;
                    634: 
                    635:       nexthop = object;
                    636:       nexthop->src = *(union g_addr *)rule;
                    637:     }
                    638:   return RMAP_OKAY;
                    639: }
                    640: 
                    641: /* set src compilation. */
                    642: static void *
                    643: route_set_src_compile (const char *arg)
                    644: {
                    645:   union g_addr src, *psrc;
                    646: 
                    647:   if (inet_pton(AF_INET, arg, &src.ipv4) != 1
                    648: #ifdef HAVE_IPV6
                    649:       && inet_pton(AF_INET6, arg, &src.ipv6) != 1
                    650: #endif /* HAVE_IPV6 */
                    651:      )
                    652:     return NULL;
                    653: 
                    654:   psrc = XMALLOC (MTYPE_ROUTE_MAP_COMPILED, sizeof (union g_addr));
                    655:   *psrc = src;
                    656: 
                    657:   return psrc;
                    658: }
                    659: 
                    660: /* Free route map's compiled `set src' value. */
                    661: static void
                    662: route_set_src_free (void *rule)
                    663: {
                    664:   XFREE (MTYPE_ROUTE_MAP_COMPILED, rule);
                    665: }
                    666: 
                    667: /* Set src rule structure. */
                    668: static struct route_map_rule_cmd route_set_src_cmd = 
                    669: {
                    670:   "src",
                    671:   route_set_src,
                    672:   route_set_src_compile,
                    673:   route_set_src_free,
                    674: };
                    675: 
                    676: void
                    677: zebra_route_map_init ()
                    678: {
                    679:   route_map_init ();
                    680:   route_map_init_vty ();
                    681: 
                    682:   route_map_install_match (&route_match_interface_cmd);
                    683:   route_map_install_match (&route_match_ip_next_hop_cmd);
                    684:   route_map_install_match (&route_match_ip_next_hop_prefix_list_cmd);
                    685:   route_map_install_match (&route_match_ip_address_cmd);
                    686:   route_map_install_match (&route_match_ip_address_prefix_list_cmd);
                    687: /* */
                    688:   route_map_install_set (&route_set_src_cmd);
                    689: /* */
                    690:   install_element (RMAP_NODE, &match_interface_cmd);
                    691:   install_element (RMAP_NODE, &no_match_interface_cmd); 
                    692:   install_element (RMAP_NODE, &no_match_interface_val_cmd); 
                    693:   install_element (RMAP_NODE, &match_ip_next_hop_cmd); 
                    694:   install_element (RMAP_NODE, &no_match_ip_next_hop_cmd); 
                    695:   install_element (RMAP_NODE, &no_match_ip_next_hop_val_cmd); 
                    696:   install_element (RMAP_NODE, &match_ip_next_hop_prefix_list_cmd); 
                    697:   install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_cmd); 
                    698:   install_element (RMAP_NODE, &no_match_ip_next_hop_prefix_list_val_cmd); 
                    699:   install_element (RMAP_NODE, &match_ip_address_cmd); 
                    700:   install_element (RMAP_NODE, &no_match_ip_address_cmd); 
                    701:   install_element (RMAP_NODE, &no_match_ip_address_val_cmd); 
                    702:   install_element (RMAP_NODE, &match_ip_address_prefix_list_cmd); 
                    703:   install_element (RMAP_NODE, &no_match_ip_address_prefix_list_cmd); 
                    704:   install_element (RMAP_NODE, &no_match_ip_address_prefix_list_val_cmd);
                    705: /* */
                    706:   install_element (RMAP_NODE, &set_src_cmd);
                    707:   install_element (RMAP_NODE, &no_set_src_cmd);
                    708: }

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