Annotation of embedaddon/quagga/isisd/isis_zebra.c, revision 1.1

1.1     ! misho       1: /*
        !             2:  * IS-IS Rout(e)ing protocol - isis_zebra.c   
        !             3:  *
        !             4:  * Copyright (C) 2001,2002   Sampo Saaristo
        !             5:  *                           Tampere University of Technology      
        !             6:  *                           Institute of Communications Engineering
        !             7:  *
        !             8:  * This program is free software; you can redistribute it and/or modify it 
        !             9:  * under the terms of the GNU General Public Licenseas published by the Free 
        !            10:  * Software Foundation; either version 2 of the License, or (at your option) 
        !            11:  * any later version.
        !            12:  *
        !            13:  * This program is distributed in the hope that it will be useful,but WITHOUT 
        !            14:  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
        !            15:  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for 
        !            16:  * more details.
        !            17: 
        !            18:  * You should have received a copy of the GNU General Public License along 
        !            19:  * with this program; if not, write to the Free Software Foundation, Inc., 
        !            20:  * 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
        !            21:  */
        !            22: 
        !            23: #include <zebra.h>
        !            24: 
        !            25: #include "thread.h"
        !            26: #include "command.h"
        !            27: #include "memory.h"
        !            28: #include "log.h"
        !            29: #include "if.h"
        !            30: #include "network.h"
        !            31: #include "prefix.h"
        !            32: #include "zclient.h"
        !            33: #include "stream.h"
        !            34: #include "linklist.h"
        !            35: 
        !            36: #include "isisd/dict.h"
        !            37: #include "isisd/isis_constants.h"
        !            38: #include "isisd/isis_common.h"
        !            39: #include "isisd/isisd.h"
        !            40: #include "isisd/isis_circuit.h"
        !            41: #include "isisd/isis_csm.h"
        !            42: #include "isisd/isis_route.h"
        !            43: #include "isisd/isis_zebra.h"
        !            44: 
        !            45: struct zclient *zclient = NULL;
        !            46: 
        !            47: extern struct thread_master *master;
        !            48: extern struct isis *isis;
        !            49: 
        !            50: struct in_addr router_id_zebra;
        !            51: 
        !            52: /* Router-id update message from zebra. */
        !            53: static int
        !            54: isis_router_id_update_zebra (int command, struct zclient *zclient,
        !            55:                             zebra_size_t length)
        !            56: {
        !            57:   struct prefix router_id;
        !            58: 
        !            59:   zebra_router_id_update_read (zclient->ibuf,&router_id);
        !            60:   router_id_zebra = router_id.u.prefix4;
        !            61: 
        !            62:   /* FIXME: Do we react somehow? */
        !            63:   return 0;
        !            64: }
        !            65: 
        !            66: static int
        !            67: isis_zebra_if_add (int command, struct zclient *zclient, zebra_size_t length)
        !            68: {
        !            69:   struct interface *ifp;
        !            70: 
        !            71:   ifp = zebra_interface_add_read (zclient->ibuf);
        !            72: 
        !            73:   if (isis->debugs & DEBUG_ZEBRA)
        !            74:     zlog_debug ("Zebra I/F add: %s index %d flags %ld metric %d mtu %d",
        !            75:                ifp->name, ifp->ifindex, (long)ifp->flags, ifp->metric, ifp->mtu);
        !            76: 
        !            77:   if (if_is_operative (ifp))
        !            78:     isis_csm_state_change (IF_UP_FROM_Z, circuit_scan_by_ifp (ifp), ifp);
        !            79: 
        !            80:   return 0;
        !            81: }
        !            82: 
        !            83: static int
        !            84: isis_zebra_if_del (int command, struct zclient *zclient, zebra_size_t length)
        !            85: {
        !            86:   struct interface *ifp;
        !            87:   struct stream *s;
        !            88: 
        !            89:   s = zclient->ibuf;
        !            90:   ifp = zebra_interface_state_read (s);
        !            91: 
        !            92:   if (!ifp)
        !            93:     return 0;
        !            94: 
        !            95:   if (if_is_operative (ifp))
        !            96:     zlog_warn ("Zebra: got delete of %s, but interface is still up",
        !            97:               ifp->name);
        !            98: 
        !            99:   if (isis->debugs & DEBUG_ZEBRA)
        !           100:     zlog_debug ("Zebra I/F delete: %s index %d flags %ld metric %d mtu %d",
        !           101:                ifp->name, ifp->ifindex, (long)ifp->flags, ifp->metric, ifp->mtu);
        !           102: 
        !           103: 
        !           104:   /* Cannot call if_delete because we should retain the pseudo interface
        !           105:      in case there is configuration info attached to it. */
        !           106:   if_delete_retain(ifp);
        !           107: 
        !           108:   isis_csm_state_change (IF_DOWN_FROM_Z, circuit_scan_by_ifp (ifp), ifp);
        !           109: 
        !           110:   ifp->ifindex = IFINDEX_INTERNAL;
        !           111: 
        !           112:   return 0;
        !           113: }
        !           114: 
        !           115: static struct interface *
        !           116: zebra_interface_if_lookup (struct stream *s)
        !           117: {
        !           118:   char ifname_tmp[INTERFACE_NAMSIZ];
        !           119: 
        !           120:   /* Read interface name. */
        !           121:   stream_get (ifname_tmp, s, INTERFACE_NAMSIZ);
        !           122: 
        !           123:   /* And look it up. */
        !           124:   return if_lookup_by_name_len(ifname_tmp,
        !           125:                               strnlen(ifname_tmp, INTERFACE_NAMSIZ));
        !           126: }
        !           127: 
        !           128: static int
        !           129: isis_zebra_if_state_up (int command, struct zclient *zclient,
        !           130:                        zebra_size_t length)
        !           131: {
        !           132:   struct interface *ifp;
        !           133: 
        !           134:   ifp = zebra_interface_if_lookup (zclient->ibuf);
        !           135: 
        !           136:   if (!ifp)
        !           137:     return 0;
        !           138: 
        !           139:   if (if_is_operative (ifp))
        !           140:     {
        !           141:       zebra_interface_if_set_value (zclient->ibuf, ifp);
        !           142:       /* HT: This is wrong actually. We can't assume that circuit exist
        !           143:        * if we delete circuit during if_state_down event. Needs rethink.
        !           144:        * TODO */
        !           145:       isis_circuit_update_params (circuit_scan_by_ifp (ifp), ifp);
        !           146:       return 0;
        !           147:     }
        !           148: 
        !           149:   zebra_interface_if_set_value (zclient->ibuf, ifp);
        !           150:   isis_csm_state_change (IF_UP_FROM_Z, circuit_scan_by_ifp (ifp), ifp);
        !           151: 
        !           152:   return 0;
        !           153: }
        !           154: 
        !           155: static int
        !           156: isis_zebra_if_state_down (int command, struct zclient *zclient,
        !           157:                          zebra_size_t length)
        !           158: {
        !           159:   struct interface *ifp;
        !           160: 
        !           161:   ifp = zebra_interface_if_lookup (zclient->ibuf);
        !           162: 
        !           163:   if (ifp == NULL)
        !           164:     return 0;
        !           165: 
        !           166:   if (if_is_operative (ifp))
        !           167:     {
        !           168:       zebra_interface_if_set_value (zclient->ibuf, ifp);
        !           169:       isis_csm_state_change (IF_DOWN_FROM_Z, circuit_scan_by_ifp (ifp), ifp);
        !           170:     }
        !           171: 
        !           172:   return 0;
        !           173: }
        !           174: 
        !           175: static int
        !           176: isis_zebra_if_address_add (int command, struct zclient *zclient,
        !           177:                           zebra_size_t length)
        !           178: {
        !           179:   struct connected *c;
        !           180:   struct prefix *p;
        !           181:   char buf[BUFSIZ];
        !           182: 
        !           183:   c = zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_ADD,
        !           184:                                    zclient->ibuf);
        !           185: 
        !           186:   if (c == NULL)
        !           187:     return 0;
        !           188: 
        !           189:   p = c->address;
        !           190: 
        !           191:   prefix2str (p, buf, BUFSIZ);
        !           192: #ifdef EXTREME_DEBUG
        !           193:   if (p->family == AF_INET)
        !           194:     zlog_debug ("connected IP address %s", buf);
        !           195: #ifdef HAVE_IPV6
        !           196:   if (p->family == AF_INET6)
        !           197:     zlog_debug ("connected IPv6 address %s", buf);
        !           198: #endif /* HAVE_IPV6 */
        !           199: #endif /* EXTREME_DEBUG */
        !           200:   if (if_is_operative (c->ifp))
        !           201:     isis_circuit_add_addr (circuit_scan_by_ifp (c->ifp), c);
        !           202: 
        !           203:   return 0;
        !           204: }
        !           205: 
        !           206: static int
        !           207: isis_zebra_if_address_del (int command, struct zclient *client,
        !           208:                           zebra_size_t length)
        !           209: {
        !           210:   struct connected *c;
        !           211:   struct interface *ifp;
        !           212: #ifdef EXTREME_DEBUG
        !           213:   struct prefix *p;
        !           214:   u_char buf[BUFSIZ];
        !           215: #endif /* EXTREME_DEBUG */
        !           216: 
        !           217:   c = zebra_interface_address_read (ZEBRA_INTERFACE_ADDRESS_DELETE,
        !           218:                                    zclient->ibuf);
        !           219: 
        !           220:   if (c == NULL)
        !           221:     return 0;
        !           222: 
        !           223:   ifp = c->ifp;
        !           224: 
        !           225: #ifdef EXTREME_DEBUG
        !           226:   p = c->address;
        !           227:   prefix2str (p, buf, BUFSIZ);
        !           228: 
        !           229:   if (p->family == AF_INET)
        !           230:     zlog_debug ("disconnected IP address %s", buf);
        !           231: #ifdef HAVE_IPV6
        !           232:   if (p->family == AF_INET6)
        !           233:     zlog_debug ("disconnected IPv6 address %s", buf);
        !           234: #endif /* HAVE_IPV6 */
        !           235: #endif /* EXTREME_DEBUG */
        !           236: 
        !           237:   if (if_is_operative (ifp))
        !           238:     isis_circuit_del_addr (circuit_scan_by_ifp (ifp), c);
        !           239:   connected_free (c);
        !           240: 
        !           241:   return 0;
        !           242: }
        !           243: 
        !           244: static void
        !           245: isis_zebra_route_add_ipv4 (struct prefix *prefix,
        !           246:                           struct isis_route_info *route_info)
        !           247: {
        !           248:   u_char message, flags;
        !           249:   int psize;
        !           250:   struct stream *stream;
        !           251:   struct isis_nexthop *nexthop;
        !           252:   struct listnode *node;
        !           253: 
        !           254:   if (CHECK_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC))
        !           255:     return;
        !           256: 
        !           257:   if (zclient->redist[ZEBRA_ROUTE_ISIS])
        !           258:     {
        !           259:       message = 0;
        !           260:       flags = 0;
        !           261: 
        !           262:       SET_FLAG (message, ZAPI_MESSAGE_NEXTHOP);
        !           263:       SET_FLAG (message, ZAPI_MESSAGE_METRIC);
        !           264: #if 0
        !           265:       SET_FLAG (message, ZAPI_MESSAGE_DISTANCE);
        !           266: #endif
        !           267: 
        !           268:       stream = zclient->obuf;
        !           269:       stream_reset (stream);
        !           270:       zclient_create_header (stream, ZEBRA_IPV4_ROUTE_ADD);
        !           271:       /* type */
        !           272:       stream_putc (stream, ZEBRA_ROUTE_ISIS);
        !           273:       /* flags */
        !           274:       stream_putc (stream, flags);
        !           275:       /* message */
        !           276:       stream_putc (stream, message);
        !           277:       /* prefix information */
        !           278:       psize = PSIZE (prefix->prefixlen);
        !           279:       stream_putc (stream, prefix->prefixlen);
        !           280:       stream_write (stream, (u_char *) & prefix->u.prefix4, psize);
        !           281: 
        !           282:       stream_putc (stream, listcount (route_info->nexthops));
        !           283: 
        !           284:       /* Nexthop, ifindex, distance and metric information */
        !           285:       for (ALL_LIST_ELEMENTS_RO (route_info->nexthops, node, nexthop))
        !           286:        {
        !           287:          /* FIXME: can it be ? */
        !           288:          if (nexthop->ip.s_addr != INADDR_ANY)
        !           289:            {
        !           290:              stream_putc (stream, ZEBRA_NEXTHOP_IPV4);
        !           291:              stream_put_in_addr (stream, &nexthop->ip);
        !           292:            }
        !           293:          else
        !           294:            {
        !           295:              stream_putc (stream, ZEBRA_NEXTHOP_IFINDEX);
        !           296:              stream_putl (stream, nexthop->ifindex);
        !           297:            }
        !           298:        }
        !           299: #if 0
        !           300:       if (CHECK_FLAG (message, ZAPI_MESSAGE_DISTANCE))
        !           301:        stream_putc (stream, route_info->depth);
        !           302: #endif
        !           303:       if (CHECK_FLAG (message, ZAPI_MESSAGE_METRIC))
        !           304:        stream_putl (stream, route_info->cost);
        !           305: 
        !           306:       stream_putw_at (stream, 0, stream_get_endp (stream));
        !           307:       zclient_send_message(zclient);
        !           308:       SET_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC);
        !           309:     }
        !           310: }
        !           311: 
        !           312: static void
        !           313: isis_zebra_route_del_ipv4 (struct prefix *prefix,
        !           314:                           struct isis_route_info *route_info)
        !           315: {
        !           316:   struct zapi_ipv4 api;
        !           317:   struct prefix_ipv4 prefix4;
        !           318: 
        !           319:   if (zclient->redist[ZEBRA_ROUTE_ISIS])
        !           320:     {
        !           321:       api.type = ZEBRA_ROUTE_ISIS;
        !           322:       api.flags = 0;
        !           323:       api.message = 0;
        !           324:       prefix4.family = AF_INET;
        !           325:       prefix4.prefixlen = prefix->prefixlen;
        !           326:       prefix4.prefix = prefix->u.prefix4;
        !           327:       zapi_ipv4_route (ZEBRA_IPV4_ROUTE_DELETE, zclient, &prefix4, &api);
        !           328:     }
        !           329:   UNSET_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC);
        !           330: 
        !           331:   return;
        !           332: }
        !           333: 
        !           334: #ifdef HAVE_IPV6
        !           335: void
        !           336: isis_zebra_route_add_ipv6 (struct prefix *prefix,
        !           337:                           struct isis_route_info *route_info)
        !           338: {
        !           339:   struct zapi_ipv6 api;
        !           340:   struct in6_addr **nexthop_list;
        !           341:   unsigned int *ifindex_list;
        !           342:   struct isis_nexthop6 *nexthop6;
        !           343:   int i, size;
        !           344:   struct listnode *node;
        !           345:   struct prefix_ipv6 prefix6;
        !           346: 
        !           347:   if (CHECK_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC))
        !           348:     return;
        !           349: 
        !           350:   api.type = ZEBRA_ROUTE_ISIS;
        !           351:   api.flags = 0;
        !           352:   api.message = 0;
        !           353:   SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
        !           354:   SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX);
        !           355:   SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
        !           356:   api.metric = route_info->cost;
        !           357: #if 0
        !           358:   SET_FLAG (api.message, ZAPI_MESSAGE_DISTANCE);
        !           359:   api.distance = route_info->depth;
        !           360: #endif
        !           361:   api.nexthop_num = listcount (route_info->nexthops6);
        !           362:   api.ifindex_num = listcount (route_info->nexthops6);
        !           363: 
        !           364:   /* allocate memory for nexthop_list */
        !           365:   size = sizeof (struct isis_nexthop6 *) * listcount (route_info->nexthops6);
        !           366:   nexthop_list = (struct in6_addr **) XMALLOC (MTYPE_ISIS_TMP, size);
        !           367:   if (!nexthop_list)
        !           368:     {
        !           369:       zlog_err ("isis_zebra_add_route_ipv6: out of memory!");
        !           370:       return;
        !           371:     }
        !           372: 
        !           373:   /* allocate memory for ifindex_list */
        !           374:   size = sizeof (unsigned int) * listcount (route_info->nexthops6);
        !           375:   ifindex_list = (unsigned int *) XMALLOC (MTYPE_ISIS_TMP, size);
        !           376:   if (!ifindex_list)
        !           377:     {
        !           378:       zlog_err ("isis_zebra_add_route_ipv6: out of memory!");
        !           379:       XFREE (MTYPE_ISIS_TMP, nexthop_list);
        !           380:       return;
        !           381:     }
        !           382: 
        !           383:   /* for each nexthop */
        !           384:   i = 0;
        !           385:   for (ALL_LIST_ELEMENTS_RO (route_info->nexthops6, node, nexthop6))
        !           386:     {
        !           387:       if (!IN6_IS_ADDR_LINKLOCAL (&nexthop6->ip6) &&
        !           388:          !IN6_IS_ADDR_UNSPECIFIED (&nexthop6->ip6))
        !           389:        {
        !           390:          api.nexthop_num--;
        !           391:          api.ifindex_num--;
        !           392:          continue;
        !           393:        }
        !           394: 
        !           395:       nexthop_list[i] = &nexthop6->ip6;
        !           396:       ifindex_list[i] = nexthop6->ifindex;
        !           397:       i++;
        !           398:     }
        !           399: 
        !           400:   api.nexthop = nexthop_list;
        !           401:   api.ifindex = ifindex_list;
        !           402: 
        !           403:   if (api.nexthop_num && api.ifindex_num)
        !           404:     {
        !           405:       prefix6.family = AF_INET6;
        !           406:       prefix6.prefixlen = prefix->prefixlen;
        !           407:       memcpy (&prefix6.prefix, &prefix->u.prefix6, sizeof (struct in6_addr));
        !           408:       zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD, zclient, &prefix6, &api);
        !           409:       SET_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC);
        !           410:     }
        !           411: 
        !           412:   XFREE (MTYPE_ISIS_TMP, nexthop_list);
        !           413:   XFREE (MTYPE_ISIS_TMP, ifindex_list);
        !           414: 
        !           415:   return;
        !           416: }
        !           417: 
        !           418: static void
        !           419: isis_zebra_route_del_ipv6 (struct prefix *prefix,
        !           420:                           struct isis_route_info *route_info)
        !           421: {
        !           422:   struct zapi_ipv6 api;
        !           423:   struct in6_addr **nexthop_list;
        !           424:   unsigned int *ifindex_list;
        !           425:   struct isis_nexthop6 *nexthop6;
        !           426:   int i, size;
        !           427:   struct listnode *node;
        !           428:   struct prefix_ipv6 prefix6;
        !           429: 
        !           430:   if (CHECK_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC))
        !           431:     return;
        !           432: 
        !           433:   api.type = ZEBRA_ROUTE_ISIS;
        !           434:   api.flags = 0;
        !           435:   api.message = 0;
        !           436:   SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
        !           437:   SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX);
        !           438:   api.nexthop_num = listcount (route_info->nexthops6);
        !           439:   api.ifindex_num = listcount (route_info->nexthops6);
        !           440: 
        !           441:   /* allocate memory for nexthop_list */
        !           442:   size = sizeof (struct isis_nexthop6 *) * listcount (route_info->nexthops6);
        !           443:   nexthop_list = (struct in6_addr **) XMALLOC (MTYPE_ISIS_TMP, size);
        !           444:   if (!nexthop_list)
        !           445:     {
        !           446:       zlog_err ("isis_zebra_route_del_ipv6: out of memory!");
        !           447:       return;
        !           448:     }
        !           449: 
        !           450:   /* allocate memory for ifindex_list */
        !           451:   size = sizeof (unsigned int) * listcount (route_info->nexthops6);
        !           452:   ifindex_list = (unsigned int *) XMALLOC (MTYPE_ISIS_TMP, size);
        !           453:   if (!ifindex_list)
        !           454:     {
        !           455:       zlog_err ("isis_zebra_route_del_ipv6: out of memory!");
        !           456:       XFREE (MTYPE_ISIS_TMP, nexthop_list);
        !           457:       return;
        !           458:     }
        !           459: 
        !           460:   /* for each nexthop */
        !           461:   i = 0;
        !           462:   for (ALL_LIST_ELEMENTS_RO (route_info->nexthops6, node, nexthop6))
        !           463:     {
        !           464:       if (!IN6_IS_ADDR_LINKLOCAL (&nexthop6->ip6) &&
        !           465:          !IN6_IS_ADDR_UNSPECIFIED (&nexthop6->ip6))
        !           466:        {
        !           467:          api.nexthop_num--;
        !           468:          api.ifindex_num--;
        !           469:          continue;
        !           470:        }
        !           471: 
        !           472:       nexthop_list[i] = &nexthop6->ip6;
        !           473:       ifindex_list[i] = nexthop6->ifindex;
        !           474:       i++;
        !           475:     }
        !           476: 
        !           477:   api.nexthop = nexthop_list;
        !           478:   api.ifindex = ifindex_list;
        !           479: 
        !           480:   if (api.nexthop_num && api.ifindex_num)
        !           481:     {
        !           482:       prefix6.family = AF_INET6;
        !           483:       prefix6.prefixlen = prefix->prefixlen;
        !           484:       memcpy (&prefix6.prefix, &prefix->u.prefix6, sizeof (struct in6_addr));
        !           485:       zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient, &prefix6, &api);
        !           486:       UNSET_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ZEBRA_SYNC);
        !           487:     }
        !           488: 
        !           489:   XFREE (MTYPE_ISIS_TMP, nexthop_list);
        !           490:   XFREE (MTYPE_ISIS_TMP, ifindex_list);
        !           491: }
        !           492: 
        !           493: #endif /* HAVE_IPV6 */
        !           494: 
        !           495: void
        !           496: isis_zebra_route_update (struct prefix *prefix,
        !           497:                         struct isis_route_info *route_info)
        !           498: {
        !           499:   if (zclient->sock < 0)
        !           500:     return;
        !           501: 
        !           502:   if (!zclient->redist[ZEBRA_ROUTE_ISIS])
        !           503:     return;
        !           504: 
        !           505:   if (CHECK_FLAG (route_info->flag, ISIS_ROUTE_FLAG_ACTIVE))
        !           506:     {
        !           507:       if (prefix->family == AF_INET)
        !           508:        isis_zebra_route_add_ipv4 (prefix, route_info);
        !           509: #ifdef HAVE_IPV6
        !           510:       else if (prefix->family == AF_INET6)
        !           511:        isis_zebra_route_add_ipv6 (prefix, route_info);
        !           512: #endif /* HAVE_IPV6 */
        !           513:     }
        !           514:   else
        !           515:     {
        !           516:       if (prefix->family == AF_INET)
        !           517:        isis_zebra_route_del_ipv4 (prefix, route_info);
        !           518: #ifdef HAVE_IPV6
        !           519:       else if (prefix->family == AF_INET6)
        !           520:        isis_zebra_route_del_ipv6 (prefix, route_info);
        !           521: #endif /* HAVE_IPV6 */
        !           522:     }
        !           523:   return;
        !           524: }
        !           525: 
        !           526: static int
        !           527: isis_zebra_read_ipv4 (int command, struct zclient *zclient,
        !           528:                      zebra_size_t length)
        !           529: {
        !           530:   struct stream *stream;
        !           531:   struct zapi_ipv4 api;
        !           532:   struct prefix_ipv4 p;
        !           533:   unsigned long ifindex;
        !           534:   struct in_addr nexthop;
        !           535: 
        !           536:   stream = zclient->ibuf;
        !           537:   memset (&p, 0, sizeof (struct prefix_ipv4));
        !           538:   ifindex = 0;
        !           539: 
        !           540:   api.type = stream_getc (stream);
        !           541:   api.flags = stream_getc (stream);
        !           542:   api.message = stream_getc (stream);
        !           543: 
        !           544:   p.family = AF_INET;
        !           545:   p.prefixlen = stream_getc (stream);
        !           546:   stream_get (&p.prefix, stream, PSIZE (p.prefixlen));
        !           547: 
        !           548:   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP))
        !           549:     {
        !           550:       api.nexthop_num = stream_getc (stream);
        !           551:       nexthop.s_addr = stream_get_ipv4 (stream);
        !           552:     }
        !           553:   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_IFINDEX))
        !           554:     {
        !           555:       api.ifindex_num = stream_getc (stream);
        !           556:       ifindex = stream_getl (stream);
        !           557:     }
        !           558:   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_DISTANCE))
        !           559:     api.distance = stream_getc (stream);
        !           560:   if (CHECK_FLAG (api.message, ZAPI_MESSAGE_METRIC))
        !           561:     api.metric = stream_getl (stream);
        !           562:   else
        !           563:     api.metric = 0;
        !           564: 
        !           565:   if (command == ZEBRA_IPV4_ROUTE_ADD)
        !           566:     {
        !           567:       if (isis->debugs & DEBUG_ZEBRA)
        !           568:        zlog_debug ("IPv4 Route add from Z");
        !           569:     }
        !           570: 
        !           571:   return 0;
        !           572: }
        !           573: 
        !           574: #ifdef HAVE_IPV6
        !           575: static int
        !           576: isis_zebra_read_ipv6 (int command, struct zclient *zclient,
        !           577:                      zebra_size_t length)
        !           578: {
        !           579:   return 0;
        !           580: }
        !           581: #endif
        !           582: 
        !           583: #define ISIS_TYPE_IS_REDISTRIBUTED(T) \
        !           584: T == ZEBRA_ROUTE_MAX ? zclient->default_information : zclient->redist[type]
        !           585: 
        !           586: int
        !           587: isis_distribute_list_update (int routetype)
        !           588: {
        !           589:   return 0;
        !           590: }
        !           591: 
        !           592: #if 0 /* Not yet. */
        !           593: static int
        !           594: isis_redistribute_default_set (int routetype, int metric_type,
        !           595:                               int metric_value)
        !           596: {
        !           597:   return 0;
        !           598: }
        !           599: #endif /* 0 */
        !           600: 
        !           601: void
        !           602: isis_zebra_init ()
        !           603: {
        !           604:   zclient = zclient_new ();
        !           605:   zclient_init (zclient, ZEBRA_ROUTE_ISIS);
        !           606:   zclient->router_id_update = isis_router_id_update_zebra;
        !           607:   zclient->interface_add = isis_zebra_if_add;
        !           608:   zclient->interface_delete = isis_zebra_if_del;
        !           609:   zclient->interface_up = isis_zebra_if_state_up;
        !           610:   zclient->interface_down = isis_zebra_if_state_down;
        !           611:   zclient->interface_address_add = isis_zebra_if_address_add;
        !           612:   zclient->interface_address_delete = isis_zebra_if_address_del;
        !           613:   zclient->ipv4_route_add = isis_zebra_read_ipv4;
        !           614:   zclient->ipv4_route_delete = isis_zebra_read_ipv4;
        !           615: #ifdef HAVE_IPV6
        !           616:   zclient->ipv6_route_add = isis_zebra_read_ipv6;
        !           617:   zclient->ipv6_route_delete = isis_zebra_read_ipv6;
        !           618: #endif /* HAVE_IPV6 */
        !           619: 
        !           620:   return;
        !           621: }

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