Annotation of embedaddon/quagga/ripd/rip_zebra.c, revision 1.1.1.1

1.1       misho       1: /* RIPd and zebra interface.
                      2:  * Copyright (C) 1997, 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
                      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 "command.h"
                     25: #include "prefix.h"
                     26: #include "stream.h"
                     27: #include "routemap.h"
                     28: #include "zclient.h"
                     29: #include "log.h"
                     30: #include "ripd/ripd.h"
                     31: #include "ripd/rip_debug.h"
                     32: #include "ripd/rip_interface.h"
                     33: 
                     34: /* All information about zebra. */
                     35: struct zclient *zclient = NULL;
                     36: 
                     37: /* RIPd to zebra command interface. */
                     38: void
                     39: rip_zebra_ipv4_add (struct prefix_ipv4 *p, struct in_addr *nexthop, 
                     40:                    u_int32_t metric, u_char distance)
                     41: {
                     42:   struct zapi_ipv4 api;
                     43: 
                     44:   if (zclient->redist[ZEBRA_ROUTE_RIP])
                     45:     {
                     46:       api.type = ZEBRA_ROUTE_RIP;
                     47:       api.flags = 0;
                     48:       api.message = 0;
                     49:       SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
                     50:       api.nexthop_num = 1;
                     51:       api.nexthop = &nexthop;
                     52:       api.ifindex_num = 0;
                     53:       SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
                     54:       api.metric = metric;
                     55: 
                     56:       if (distance && distance != ZEBRA_RIP_DISTANCE_DEFAULT)
                     57:        {
                     58:          SET_FLAG (api.message, ZAPI_MESSAGE_DISTANCE);
                     59:          api.distance = distance;
                     60:        }
                     61: 
                     62:       zapi_ipv4_route (ZEBRA_IPV4_ROUTE_ADD, zclient, p, &api);
                     63: 
                     64:       rip_global_route_changes++;
                     65:     }
                     66: }
                     67: 
                     68: void
                     69: rip_zebra_ipv4_delete (struct prefix_ipv4 *p, struct in_addr *nexthop, 
                     70:                       u_int32_t metric)
                     71: {
                     72:   struct zapi_ipv4 api;
                     73: 
                     74:   if (zclient->redist[ZEBRA_ROUTE_RIP])
                     75:     {
                     76:       api.type = ZEBRA_ROUTE_RIP;
                     77:       api.flags = 0;
                     78:       api.message = 0;
                     79:       SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
                     80:       api.nexthop_num = 1;
                     81:       api.nexthop = &nexthop;
                     82:       api.ifindex_num = 0;
                     83:       SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
                     84:       api.metric = metric;
                     85: 
                     86:       zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE, zclient, p, &api);
                     87: 
                     88:       rip_global_route_changes++;
                     89:     }
                     90: }
                     91: 
                     92: /* Zebra route add and delete treatment. */
                     93: static int
                     94: rip_zebra_read_ipv4 (int command, struct zclient *zclient, zebra_size_t length)
                     95: {
                     96:   struct stream *s;
                     97:   struct zapi_ipv4 api;
                     98:   unsigned long ifindex;
                     99:   struct in_addr nexthop;
                    100:   struct prefix_ipv4 p;
                    101:   
                    102:   s = zclient->ibuf;
                    103:   ifindex = 0;
                    104:   nexthop.s_addr = 0;
                    105: 
                    106:   /* Type, flags, message. */
                    107:   api.type = stream_getc (s);
                    108:   api.flags = stream_getc (s);
                    109:   api.message = stream_getc (s);
                    110: 
                    111:   /* IPv4 prefix. */
                    112:   memset (&p, 0, sizeof (struct prefix_ipv4));
                    113:   p.family = AF_INET;
                    114:   p.prefixlen = stream_getc (s);
                    115:   stream_get (&p.prefix, s, PSIZE (p.prefixlen));
                    116: 
                    117:   /* Nexthop, ifindex, distance, metric. */
                    118:   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
                    119:     {
                    120:       api.nexthop_num = stream_getc (s);
                    121:       nexthop.s_addr = stream_get_ipv4 (s);
                    122:     }
                    123:   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX))
                    124:     {
                    125:       api.ifindex_num = stream_getc (s);
                    126:       ifindex = stream_getl (s);
                    127:     }
                    128:   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE))
                    129:     api.distance = stream_getc (s);
                    130:   else
                    131:     api.distance = 255;
                    132:   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC))
                    133:     api.metric = stream_getl (s);
                    134:   else
                    135:     api.metric = 0;
                    136: 
                    137:   /* Then fetch IPv4 prefixes. */
                    138:   if (command == ZEBRA_IPV4_ROUTE_ADD)
                    139:     rip_redistribute_add (api.type, RIP_ROUTE_REDISTRIBUTE, &p, ifindex, 
                    140:                           &nexthop, api.metric, api.distance);
                    141:   else 
                    142:     rip_redistribute_delete (api.type, RIP_ROUTE_REDISTRIBUTE, &p, ifindex);
                    143: 
                    144:   return 0;
                    145: }
                    146: 
                    147: void
                    148: rip_zclient_reset (void)
                    149: {
                    150:   zclient_reset (zclient);
                    151: }
                    152: 
                    153: /* RIP route-map set for redistribution */
                    154: static void
                    155: rip_routemap_set (int type, const char *name)
                    156: {
                    157:   if (rip->route_map[type].name)
                    158:     free(rip->route_map[type].name);
                    159: 
                    160:   rip->route_map[type].name = strdup (name);
                    161:   rip->route_map[type].map = route_map_lookup_by_name (name);
                    162: }
                    163: 
                    164: static void
                    165: rip_redistribute_metric_set (int type, unsigned int metric)
                    166: {
                    167:   rip->route_map[type].metric_config = 1;
                    168:   rip->route_map[type].metric = metric;
                    169: }
                    170: 
                    171: static int
                    172: rip_metric_unset (int type, unsigned int metric)
                    173: {
                    174: #define DONT_CARE_METRIC_RIP 17  
                    175:   if (metric != DONT_CARE_METRIC_RIP &&
                    176:       rip->route_map[type].metric != metric)
                    177:     return 1;
                    178:   rip->route_map[type].metric_config = 0;
                    179:   rip->route_map[type].metric = 0;
                    180:   return 0;
                    181: }
                    182: 
                    183: /* RIP route-map unset for redistribution */
                    184: static int
                    185: rip_routemap_unset (int type, const char *name)
                    186: {
                    187:   if (! rip->route_map[type].name ||
                    188:       (name != NULL && strcmp(rip->route_map[type].name,name)))
                    189:     return 1;
                    190: 
                    191:   free (rip->route_map[type].name);
                    192:   rip->route_map[type].name = NULL;
                    193:   rip->route_map[type].map = NULL;
                    194: 
                    195:   return 0;
                    196: }
                    197: 
                    198: /* Redistribution types */
                    199: static struct {
                    200:   int type;
                    201:   int str_min_len;
                    202:   const char *str;
                    203: } redist_type[] = {
                    204:   {ZEBRA_ROUTE_KERNEL,  1, "kernel"},
                    205:   {ZEBRA_ROUTE_CONNECT, 1, "connected"},
                    206:   {ZEBRA_ROUTE_STATIC,  1, "static"},
                    207:   {ZEBRA_ROUTE_OSPF,    1, "ospf"},
                    208:   {ZEBRA_ROUTE_BGP,     1, "bgp"},
                    209:   {0, 0, NULL}
                    210: };
                    211: 
                    212: DEFUN (router_zebra,
                    213:        router_zebra_cmd,
                    214:        "router zebra",
                    215:        "Enable a routing process\n"
                    216:        "Make connection to zebra daemon\n")
                    217: {
                    218:   vty->node = ZEBRA_NODE;
                    219:   zclient->enable = 1;
                    220:   zclient_start (zclient);
                    221:   return CMD_SUCCESS;
                    222: }
                    223: 
                    224: DEFUN (no_router_zebra,
                    225:        no_router_zebra_cmd,
                    226:        "no router zebra",
                    227:        NO_STR
                    228:        "Enable a routing process\n"
                    229:        "Make connection to zebra daemon\n")
                    230: {
                    231:   zclient->enable = 0;
                    232:   zclient_stop (zclient);
                    233:   return CMD_SUCCESS;
                    234: }
                    235: 
                    236: #if 0
                    237: static int
                    238: rip_redistribute_set (int type)
                    239: {
                    240:   if (zclient->redist[type])
                    241:     return CMD_SUCCESS;
                    242: 
                    243:   zclient->redist[type] = 1;
                    244: 
                    245:   if (zclient->sock > 0)
                    246:     zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient, type);
                    247: 
                    248:   return CMD_SUCCESS;
                    249: }
                    250: #endif
                    251: 
                    252: static int
                    253: rip_redistribute_unset (int type)
                    254: {
                    255:   if (! zclient->redist[type])
                    256:     return CMD_SUCCESS;
                    257: 
                    258:   zclient->redist[type] = 0;
                    259: 
                    260:   if (zclient->sock > 0)
                    261:     zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type);
                    262: 
                    263:   /* Remove the routes from RIP table. */
                    264:   rip_redistribute_withdraw (type);
                    265: 
                    266:   return CMD_SUCCESS;
                    267: }
                    268: 
                    269: int
                    270: rip_redistribute_check (int type)
                    271: {
                    272:   return (zclient->redist[type]);
                    273: }
                    274: 
                    275: void
                    276: rip_redistribute_clean (void)
                    277: {
                    278:   int i;
                    279: 
                    280:   for (i = 0; redist_type[i].str; i++)
                    281:     {
                    282:       if (zclient->redist[redist_type[i].type])
                    283:        {
                    284:          if (zclient->sock > 0)
                    285:            zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE,
                    286:                                     zclient, redist_type[i].type);
                    287: 
                    288:          zclient->redist[redist_type[i].type] = 0;
                    289: 
                    290:          /* Remove the routes from RIP table. */
                    291:          rip_redistribute_withdraw (redist_type[i].type);
                    292:        }
                    293:     }
                    294: }
                    295: 
                    296: DEFUN (rip_redistribute_rip,
                    297:        rip_redistribute_rip_cmd,
                    298:        "redistribute rip",
                    299:        "Redistribute information from another routing protocol\n"
                    300:        "Routing Information Protocol (RIP)\n")
                    301: {
                    302:   zclient->redist[ZEBRA_ROUTE_RIP] = 1;
                    303:   return CMD_SUCCESS;
                    304: }
                    305: 
                    306: DEFUN (no_rip_redistribute_rip,
                    307:        no_rip_redistribute_rip_cmd,
                    308:        "no redistribute rip",
                    309:        NO_STR
                    310:        "Redistribute information from another routing protocol\n"
                    311:        "Routing Information Protocol (RIP)\n")
                    312: {
                    313:   zclient->redist[ZEBRA_ROUTE_RIP] = 0;
                    314:   return CMD_SUCCESS;
                    315: }
                    316: 
                    317: DEFUN (rip_redistribute_type,
                    318:        rip_redistribute_type_cmd,
                    319:        "redistribute " QUAGGA_REDIST_STR_RIPD,
                    320:        REDIST_STR
                    321:        QUAGGA_REDIST_HELP_STR_RIPD)
                    322: {
                    323:   int i;
                    324: 
                    325:   for(i = 0; redist_type[i].str; i++) 
                    326:     {
                    327:       if (strncmp (redist_type[i].str, argv[0], 
                    328:                   redist_type[i].str_min_len) == 0) 
                    329:        {
                    330:          zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, 
                    331:                                redist_type[i].type);
                    332:          return CMD_SUCCESS;
                    333:        }
                    334:     }
                    335: 
                    336:   vty_out(vty, "Invalid type %s%s", argv[0],
                    337:          VTY_NEWLINE);
                    338: 
                    339:   return CMD_WARNING;
                    340: }
                    341: 
                    342: DEFUN (no_rip_redistribute_type,
                    343:        no_rip_redistribute_type_cmd,
                    344:        "no redistribute " QUAGGA_REDIST_STR_RIPD,
                    345:        NO_STR
                    346:        REDIST_STR
                    347:        QUAGGA_REDIST_HELP_STR_RIPD)
                    348: {
                    349:   int i;
                    350: 
                    351:   for (i = 0; redist_type[i].str; i++) 
                    352:     {
                    353:       if (strncmp(redist_type[i].str, argv[0], 
                    354:                  redist_type[i].str_min_len) == 0) 
                    355:        {
                    356:          rip_metric_unset (redist_type[i].type, DONT_CARE_METRIC_RIP);
                    357:          rip_routemap_unset (redist_type[i].type,NULL);
                    358:          rip_redistribute_unset (redist_type[i].type);
                    359:          return CMD_SUCCESS;
                    360:         }
                    361:     }
                    362: 
                    363:   vty_out(vty, "Invalid type %s%s", argv[0],
                    364:          VTY_NEWLINE);
                    365: 
                    366:   return CMD_WARNING;
                    367: }
                    368: 
                    369: DEFUN (rip_redistribute_type_routemap,
                    370:        rip_redistribute_type_routemap_cmd,
                    371:        "redistribute " QUAGGA_REDIST_STR_RIPD " route-map WORD",
                    372:        REDIST_STR
                    373:        QUAGGA_REDIST_HELP_STR_RIPD
                    374:        "Route map reference\n"
                    375:        "Pointer to route-map entries\n")
                    376: {
                    377:   int i;
                    378: 
                    379:   for (i = 0; redist_type[i].str; i++) {
                    380:     if (strncmp(redist_type[i].str, argv[0],
                    381:                redist_type[i].str_min_len) == 0) 
                    382:       {
                    383:        rip_routemap_set (redist_type[i].type, argv[1]);
                    384:        zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, redist_type[i].type);
                    385:        return CMD_SUCCESS;
                    386:       }
                    387:   }
                    388: 
                    389:   vty_out(vty, "Invalid type %s%s", argv[0],
                    390:          VTY_NEWLINE);
                    391: 
                    392:   return CMD_WARNING;
                    393: }
                    394: 
                    395: DEFUN (no_rip_redistribute_type_routemap,
                    396:        no_rip_redistribute_type_routemap_cmd,
                    397:        "no redistribute " QUAGGA_REDIST_STR_RIPD " route-map WORD",
                    398:        NO_STR
                    399:        REDIST_STR
                    400:        QUAGGA_REDIST_HELP_STR_RIPD
                    401:        "Route map reference\n"
                    402:        "Pointer to route-map entries\n")
                    403: {
                    404:   int i;
                    405: 
                    406:   for (i = 0; redist_type[i].str; i++) 
                    407:     {
                    408:       if (strncmp(redist_type[i].str, argv[0], 
                    409:                  redist_type[i].str_min_len) == 0) 
                    410:        {
                    411:          if (rip_routemap_unset (redist_type[i].type,argv[1]))
                    412:            return CMD_WARNING;
                    413:          rip_redistribute_unset (redist_type[i].type);
                    414:          return CMD_SUCCESS;
                    415:         }
                    416:     }
                    417: 
                    418:   vty_out(vty, "Invalid type %s%s", argv[0],
                    419:          VTY_NEWLINE);
                    420: 
                    421:   return CMD_WARNING;
                    422: }
                    423: 
                    424: DEFUN (rip_redistribute_type_metric,
                    425:        rip_redistribute_type_metric_cmd,
                    426:        "redistribute " QUAGGA_REDIST_STR_RIPD " metric <0-16>",
                    427:        REDIST_STR
                    428:        QUAGGA_REDIST_HELP_STR_RIPD
                    429:        "Metric\n"
                    430:        "Metric value\n")
                    431: {
                    432:   int i;
                    433:   int metric;
                    434: 
                    435:   metric = atoi (argv[1]);
                    436: 
                    437:   for (i = 0; redist_type[i].str; i++) {
                    438:     if (strncmp(redist_type[i].str, argv[0],
                    439:                redist_type[i].str_min_len) == 0) 
                    440:       {
                    441:        rip_redistribute_metric_set (redist_type[i].type, metric);
                    442:        zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, redist_type[i].type);
                    443:        return CMD_SUCCESS;
                    444:       }
                    445:   }
                    446: 
                    447:   vty_out(vty, "Invalid type %s%s", argv[0],
                    448:          VTY_NEWLINE);
                    449: 
                    450:   return CMD_WARNING;
                    451: }
                    452: 
                    453: DEFUN (no_rip_redistribute_type_metric,
                    454:        no_rip_redistribute_type_metric_cmd,
                    455:        "no redistribute " QUAGGA_REDIST_STR_RIPD " metric <0-16>",
                    456:        NO_STR
                    457:        REDIST_STR
                    458:        QUAGGA_REDIST_HELP_STR_RIPD
                    459:        "Metric\n"
                    460:        "Metric value\n")
                    461: {
                    462:   int i;
                    463: 
                    464:   for (i = 0; redist_type[i].str; i++) 
                    465:     {
                    466:       if (strncmp(redist_type[i].str, argv[0], 
                    467:                  redist_type[i].str_min_len) == 0) 
                    468:        {
                    469:          if (rip_metric_unset (redist_type[i].type, atoi(argv[1])))
                    470:            return CMD_WARNING;
                    471:          rip_redistribute_unset (redist_type[i].type);
                    472:          return CMD_SUCCESS;
                    473:         }
                    474:     }
                    475: 
                    476:   vty_out(vty, "Invalid type %s%s", argv[0],
                    477:          VTY_NEWLINE);
                    478: 
                    479:   return CMD_WARNING;
                    480: }
                    481: 
                    482: DEFUN (rip_redistribute_type_metric_routemap,
                    483:        rip_redistribute_type_metric_routemap_cmd,
                    484:        "redistribute " QUAGGA_REDIST_STR_RIPD " metric <0-16> route-map WORD",
                    485:        REDIST_STR
                    486:        QUAGGA_REDIST_HELP_STR_RIPD
                    487:        "Metric\n"
                    488:        "Metric value\n"
                    489:        "Route map reference\n"
                    490:        "Pointer to route-map entries\n")
                    491: {
                    492:   int i;
                    493:   int metric;
                    494: 
                    495:   metric = atoi (argv[1]);
                    496: 
                    497:   for (i = 0; redist_type[i].str; i++) {
                    498:     if (strncmp(redist_type[i].str, argv[0],
                    499:                redist_type[i].str_min_len) == 0) 
                    500:       {
                    501:        rip_redistribute_metric_set (redist_type[i].type, metric);
                    502:        rip_routemap_set (redist_type[i].type, argv[2]);
                    503:        zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, redist_type[i].type);
                    504:        return CMD_SUCCESS;
                    505:       }
                    506:   }
                    507: 
                    508:   vty_out(vty, "Invalid type %s%s", argv[0],
                    509:          VTY_NEWLINE);
                    510: 
                    511:   return CMD_WARNING;
                    512: }
                    513: 
                    514: 
                    515: DEFUN (no_rip_redistribute_type_metric_routemap,
                    516:        no_rip_redistribute_type_metric_routemap_cmd,
                    517:        "no redistribute " QUAGGA_REDIST_STR_RIPD
                    518:        " metric <0-16> route-map WORD",
                    519:        NO_STR
                    520:        REDIST_STR
                    521:        QUAGGA_REDIST_HELP_STR_RIPD
                    522:        "Metric\n"
                    523:        "Metric value\n"
                    524:        "Route map reference\n"
                    525:        "Pointer to route-map entries\n")
                    526: {
                    527:   int i;
                    528: 
                    529:   for (i = 0; redist_type[i].str; i++) 
                    530:     {
                    531:       if (strncmp(redist_type[i].str, argv[0], 
                    532:                  redist_type[i].str_min_len) == 0) 
                    533:        {
                    534:          if (rip_metric_unset (redist_type[i].type, atoi(argv[1])))
                    535:            return CMD_WARNING;
                    536:          if (rip_routemap_unset (redist_type[i].type, argv[2]))
                    537:            {
                    538:              rip_redistribute_metric_set(redist_type[i].type, atoi(argv[1]));   
                    539:              return CMD_WARNING;
                    540:            }
                    541:          rip_redistribute_unset (redist_type[i].type);
                    542:          return CMD_SUCCESS;
                    543:         }
                    544:     }
                    545: 
                    546:   vty_out(vty, "Invalid type %s%s", argv[0],
                    547:          VTY_NEWLINE);
                    548: 
                    549:   return CMD_WARNING;
                    550: }
                    551: 
                    552: /* Default information originate. */
                    553: 
                    554: DEFUN (rip_default_information_originate,
                    555:        rip_default_information_originate_cmd,
                    556:        "default-information originate",
                    557:        "Control distribution of default route\n"
                    558:        "Distribute a default route\n")
                    559: {
                    560:   struct prefix_ipv4 p;
                    561: 
                    562:   if (! rip->default_information)
                    563:     {
                    564:       memset (&p, 0, sizeof (struct prefix_ipv4));
                    565:       p.family = AF_INET;
                    566: 
                    567:       rip->default_information = 1;
                    568:   
                    569:       rip_redistribute_add (ZEBRA_ROUTE_RIP, RIP_ROUTE_DEFAULT, &p, 0, 
                    570:                             NULL, 0, 0);
                    571:     }
                    572: 
                    573:   return CMD_SUCCESS;
                    574: }
                    575: 
                    576: DEFUN (no_rip_default_information_originate,
                    577:        no_rip_default_information_originate_cmd,
                    578:        "no default-information originate",
                    579:        NO_STR
                    580:        "Control distribution of default route\n"
                    581:        "Distribute a default route\n")
                    582: {
                    583:   struct prefix_ipv4 p;
                    584: 
                    585:   if (rip->default_information)
                    586:     {
                    587:       memset (&p, 0, sizeof (struct prefix_ipv4));
                    588:       p.family = AF_INET;
                    589: 
                    590:       rip->default_information = 0;
                    591:   
                    592:       rip_redistribute_delete (ZEBRA_ROUTE_RIP, RIP_ROUTE_DEFAULT, &p, 0);
                    593:     }
                    594: 
                    595:   return CMD_SUCCESS;
                    596: }
                    597: 
                    598: /* RIP configuration write function. */
                    599: static int
                    600: config_write_zebra (struct vty *vty)
                    601: {
                    602:   if (! zclient->enable)
                    603:     {
                    604:       vty_out (vty, "no router zebra%s", VTY_NEWLINE);
                    605:       return 1;
                    606:     }
                    607:   else if (! zclient->redist[ZEBRA_ROUTE_RIP])
                    608:     {
                    609:       vty_out (vty, "router zebra%s", VTY_NEWLINE);
                    610:       vty_out (vty, " no redistribute rip%s", VTY_NEWLINE);
                    611:       return 1;
                    612:     }
                    613:   return 0;
                    614: }
                    615: 
                    616: int
                    617: config_write_rip_redistribute (struct vty *vty, int config_mode)
                    618: {
                    619:   int i;
                    620: 
                    621:   for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
                    622:     if (i != zclient->redist_default && zclient->redist[i])
                    623:       {
                    624:        if (config_mode)
                    625:          {
                    626:            if (rip->route_map[i].metric_config)
                    627:              {
                    628:                if (rip->route_map[i].name)
                    629:                  vty_out (vty, " redistribute %s metric %d route-map %s%s",
                    630:                           zebra_route_string(i), rip->route_map[i].metric,
                    631:                           rip->route_map[i].name,
                    632:                           VTY_NEWLINE);
                    633:                else
                    634:                  vty_out (vty, " redistribute %s metric %d%s",
                    635:                           zebra_route_string(i), rip->route_map[i].metric,
                    636:                           VTY_NEWLINE);
                    637:              }
                    638:            else
                    639:              {
                    640:                if (rip->route_map[i].name)
                    641:                  vty_out (vty, " redistribute %s route-map %s%s",
                    642:                           zebra_route_string(i), rip->route_map[i].name,
                    643:                           VTY_NEWLINE);
                    644:                else
                    645:                  vty_out (vty, " redistribute %s%s", zebra_route_string(i),
                    646:                           VTY_NEWLINE);
                    647:              }
                    648:          }
                    649:        else
                    650:          vty_out (vty, " %s", zebra_route_string(i));
                    651:       }
                    652:   return 0;
                    653: }
                    654: 
                    655: /* Zebra node structure. */
                    656: static struct cmd_node zebra_node =
                    657: {
                    658:   ZEBRA_NODE,
                    659:   "%s(config-router)# ",
                    660: };
                    661: 
                    662: void
                    663: rip_zclient_init ()
                    664: {
                    665:   /* Set default value to the zebra client structure. */
                    666:   zclient = zclient_new ();
                    667:   zclient_init (zclient, ZEBRA_ROUTE_RIP);
                    668:   zclient->interface_add = rip_interface_add;
                    669:   zclient->interface_delete = rip_interface_delete;
                    670:   zclient->interface_address_add = rip_interface_address_add;
                    671:   zclient->interface_address_delete = rip_interface_address_delete;
                    672:   zclient->ipv4_route_add = rip_zebra_read_ipv4;
                    673:   zclient->ipv4_route_delete = rip_zebra_read_ipv4;
                    674:   zclient->interface_up = rip_interface_up;
                    675:   zclient->interface_down = rip_interface_down;
                    676:   
                    677:   /* Install zebra node. */
                    678:   install_node (&zebra_node, config_write_zebra);
                    679: 
                    680:   /* Install command elements to zebra node. */ 
                    681:   install_element (CONFIG_NODE, &router_zebra_cmd);
                    682:   install_element (CONFIG_NODE, &no_router_zebra_cmd);
                    683:   install_default (ZEBRA_NODE);
                    684:   install_element (ZEBRA_NODE, &rip_redistribute_rip_cmd);
                    685:   install_element (ZEBRA_NODE, &no_rip_redistribute_rip_cmd);
                    686: 
                    687:   /* Install command elements to rip node. */
                    688:   install_element (RIP_NODE, &rip_redistribute_type_cmd);
                    689:   install_element (RIP_NODE, &rip_redistribute_type_routemap_cmd);
                    690:   install_element (RIP_NODE, &rip_redistribute_type_metric_cmd);
                    691:   install_element (RIP_NODE, &rip_redistribute_type_metric_routemap_cmd);
                    692:   install_element (RIP_NODE, &no_rip_redistribute_type_cmd);
                    693:   install_element (RIP_NODE, &no_rip_redistribute_type_routemap_cmd);
                    694:   install_element (RIP_NODE, &no_rip_redistribute_type_metric_cmd);
                    695:   install_element (RIP_NODE, &no_rip_redistribute_type_metric_routemap_cmd);
                    696:   install_element (RIP_NODE, &rip_default_information_originate_cmd);
                    697:   install_element (RIP_NODE, &no_rip_default_information_originate_cmd);
                    698: }

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