zclient.c
上传用户:xiaozhuqw
上传日期:2009-11-15
资源大小:1338k
文件大小:21k
源码类别:

网络

开发平台:

Unix_Linux

  1. /* Zebra's client library.
  2.  * Copyright (C) 1999 Kunihiro Ishiguro
  3.  *
  4.  * This file is part of GNU Zebra.
  5.  *
  6.  * GNU Zebra is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License as published
  8.  * by the Free Software Foundation; either version 2, or (at your
  9.  * option) any 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
  18.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  19.  * MA 02111-1307, USA.
  20.  */
  21. #include <zebra.h>
  22. #include "prefix.h"
  23. #include "stream.h"
  24. #include "network.h"
  25. #include "if.h"
  26. #include "log.h"
  27. #include "thread.h"
  28. #include "zclient.h"
  29. #include "memory.h"
  30. #include "table.h"
  31. #include "zebra/rib.h"
  32. #include "zebra/zserv.h"
  33. /* Zebra client events. */
  34. enum event {ZCLIENT_SCHEDULE, ZCLIENT_READ, ZCLIENT_CONNECT};
  35. /* Prototype for event manager. */
  36. static void zclient_event (enum event, struct zclient *);
  37. /* This file local debug flag. */
  38. int zclient_debug = 0;
  39. /* Allocate zclient structure. */
  40. struct zclient *
  41. zclient_new ()
  42. {
  43.   struct zclient *zclient;
  44.   zclient = XMALLOC (MTYPE_ZCLIENT, sizeof (struct zclient));
  45.   memset (zclient, 0, sizeof (struct zclient));
  46.   zclient->ibuf = stream_new (ZEBRA_MAX_PACKET_SIZ);
  47.   zclient->obuf = stream_new (ZEBRA_MAX_PACKET_SIZ);
  48.   return zclient;
  49. }
  50. /* Free zclient structure. */
  51. void
  52. zclient_free (struct zclient *zclient)
  53. {
  54.   XFREE (MTYPE_ZCLIENT, zclient);
  55. }
  56. /* Initialize zebra client.  Argument redist_default is unwanted
  57.    redistribute route type. */
  58. void
  59. zclient_init (struct zclient *zclient, int redist_default)
  60. {
  61.   int i;
  62.   
  63.   /* Enable zebra client connection by default. */
  64.   zclient->enable = 1;
  65.   /* Set -1 to the default socket value. */
  66.   zclient->sock = -1;
  67.   /* Clear redistribution flags. */
  68.   for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
  69.     zclient->redist[i] = 0;
  70.   /* Set unwanted redistribute route.  bgpd does not need BGP route
  71.      redistribution. */
  72.   zclient->redist_default = redist_default;
  73.   zclient->redist[redist_default] = 1;
  74.   /* Set default-information redistribute to zero. */
  75.   zclient->default_information = 0;
  76.   /* Schedule first zclient connection. */
  77.   if (zclient_debug)
  78.     zlog_info ("zclient start scheduled");
  79.   zclient_event (ZCLIENT_SCHEDULE, zclient);
  80. }
  81. /* Stop zebra client services. */
  82. void
  83. zclient_stop (struct zclient *zclient)
  84. {
  85.   if (zclient_debug)
  86.     zlog_info ("zclient stopped");
  87.   /* Stop threads. */
  88.   if (zclient->t_read)
  89.     {
  90.       thread_cancel (zclient->t_read);
  91.       zclient->t_read = NULL;
  92.    }
  93.   if (zclient->t_connect)
  94.     {
  95.       thread_cancel (zclient->t_connect);
  96.       zclient->t_connect = NULL;
  97.     }
  98.   /* Close socket. */
  99.   if (zclient->sock >= 0)
  100.     {
  101.       close (zclient->sock);
  102.       zclient->sock = -1;
  103.     }
  104.   zclient->fail = 0;
  105. }
  106. void
  107. zclient_reset (struct zclient *zclient)
  108. {
  109.   zclient_stop (zclient);
  110.   zclient_init (zclient, zclient->redist_default);
  111. }
  112. /* Make socket to zebra daemon. Return zebra socket. */
  113. int
  114. zclient_socket ()
  115. {
  116.   int sock;
  117.   int ret;
  118.   struct sockaddr_in serv;
  119.   /* We should think about IPv6 connection. */
  120.   sock = socket (AF_INET, SOCK_STREAM, 0);
  121.   if (sock < 0)
  122.     return -1;
  123.   
  124.   /* Make server socket. */ 
  125.   memset (&serv, 0, sizeof (struct sockaddr_in));
  126.   serv.sin_family = AF_INET;
  127.   serv.sin_port = htons (ZEBRA_PORT);
  128. #ifdef HAVE_SIN_LEN
  129.   serv.sin_len = sizeof (struct sockaddr_in);
  130. #endif /* HAVE_SIN_LEN */
  131.   serv.sin_addr.s_addr = htonl (INADDR_LOOPBACK);
  132.   /* Connect to zebra. */
  133.   ret = connect (sock, (struct sockaddr *) &serv, sizeof (serv));
  134.   if (ret < 0)
  135.     {
  136.       close (sock);
  137.       return -1;
  138.     }
  139.   return sock;
  140. }
  141. /* For sockaddr_un. */
  142. #include <sys/un.h>
  143. int
  144. zclient_socket_un (char *path)
  145. {
  146.   int ret;
  147.   int sock, len;
  148.   struct sockaddr_un addr;
  149.   sock = socket (AF_UNIX, SOCK_STREAM, 0);
  150.   if (sock < 0)
  151.     return -1;
  152.   
  153.   /* Make server socket. */ 
  154.   memset (&addr, 0, sizeof (struct sockaddr_un));
  155.   addr.sun_family = AF_UNIX;
  156.   strncpy (addr.sun_path, path, strlen (path));
  157. #ifdef HAVE_SUN_LEN
  158.   len = addr.sun_len = SUN_LEN(&addr);
  159. #else
  160.   len = sizeof (addr.sun_family) + strlen (addr.sun_path);
  161. #endif /* HAVE_SUN_LEN */
  162.   ret = connect (sock, (struct sockaddr *) &addr, len);
  163.   if (ret < 0)
  164.     {
  165.       close (sock);
  166.       return -1;
  167.     }
  168.   return sock;
  169. }
  170. /* Send simple Zebra message. */
  171. int
  172. zebra_message_send (struct zclient *zclient, int command)
  173. {
  174.   struct stream *s;
  175.   /* Get zclient output buffer. */
  176.   s = zclient->obuf;
  177.   stream_reset (s);
  178.   /* Send very simple command only Zebra message. */
  179.   stream_putw (s, 3);
  180.   stream_putc (s, command);
  181.   return writen (zclient->sock, s->data, 3);
  182. }
  183. /* Make connection to zebra daemon. */
  184. int
  185. zclient_start (struct zclient *zclient)
  186. {
  187.   int i;
  188.   if (zclient_debug)
  189.     zlog_info ("zclient_start is called");
  190.   /* zclient is disabled. */
  191.   if (! zclient->enable)
  192.     return 0;
  193.   /* If already connected to the zebra. */
  194.   if (zclient->sock >= 0)
  195.     return 0;
  196.   /* Check connect thread. */
  197.   if (zclient->t_connect)
  198.     return 0;
  199.   /* Make socket. */
  200. #ifdef HAVE_TCP_ZEBRA
  201.   zclient->sock = zclient_socket ();
  202. #else
  203.   zclient->sock = zclient_socket_un (ZEBRA_SERV_PATH);
  204. #endif /* HAVE_TCP_ZEBRA */
  205.   if (zclient->sock < 0)
  206.     {
  207.       if (zclient_debug)
  208. zlog_info ("zclient connection fail");
  209.       zclient->fail++;
  210.       zclient_event (ZCLIENT_CONNECT, zclient);
  211.       return -1;
  212.     }
  213.   /* Clear fail count. */
  214.   zclient->fail = 0;
  215.   if (zclient_debug)
  216.     zlog_info ("zclient connect success with socket [%d]", zclient->sock);
  217.       
  218.   /* Create read thread. */
  219.   zclient_event (ZCLIENT_READ, zclient);
  220.   /* We need interface information. */
  221.   zebra_message_send (zclient, ZEBRA_INTERFACE_ADD);
  222.   /* Flush all redistribute request. */
  223.   for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
  224.     if (i != zclient->redist_default && zclient->redist[i])
  225.       zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient->sock, i);
  226.   /* If default information is needed. */
  227.   if (zclient->default_information)
  228.     zebra_message_send (zclient, ZEBRA_REDISTRIBUTE_DEFAULT_ADD);
  229.   return 0;
  230. }
  231. /* This function is a wrapper function for calling zclient_start from
  232.    timer or event thread. */
  233. int
  234. zclient_connect (struct thread *t)
  235. {
  236.   struct zclient *zclient;
  237.   zclient = THREAD_ARG (t);
  238.   zclient->t_connect = NULL;
  239.   if (zclient_debug)
  240.     zlog_info ("zclient_connect is called");
  241.   return zclient_start (zclient);
  242. }
  243. int
  244. zapi_ipv4_add (struct zclient *zclient, struct prefix_ipv4 *p,
  245.        struct zapi_ipv4 *api)
  246. {
  247.   int i;
  248.   int psize;
  249.   struct stream *s;
  250.   /* Reset stream. */
  251.   s = zclient->obuf;
  252.   stream_reset (s);
  253.   /* Length place holder. */
  254.   stream_putw (s, 0);
  255.   /* Put command, type and nexthop. */
  256.   stream_putc (s, ZEBRA_IPV4_ROUTE_ADD);
  257.   stream_putc (s, api->type);
  258.   stream_putc (s, api->flags);
  259.   stream_putc (s, api->message);
  260.   
  261.   /* Put prefix information. */
  262.   psize = PSIZE (p->prefixlen);
  263.   stream_putc (s, p->prefixlen);
  264.   stream_write (s, (u_char *)&p->prefix, psize);
  265.   /* Nexthop, ifindex, distance and metric information. */
  266.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_NEXTHOP))
  267.     {
  268.       if (CHECK_FLAG (api->flags, ZEBRA_FLAG_BLACKHOLE))
  269. {
  270.   stream_putc (s, 1);
  271.   stream_putc (s, ZEBRA_NEXTHOP_BLACKHOLE);
  272. }
  273.       else
  274. stream_putc (s, api->nexthop_num + api->ifindex_num);
  275.       for (i = 0; i < api->nexthop_num; i++)
  276. {
  277.   stream_putc (s, ZEBRA_NEXTHOP_IPV4);
  278.   stream_put_in_addr (s, api->nexthop[i]);
  279. }
  280.       for (i = 0; i < api->ifindex_num; i++)
  281. {
  282.   stream_putc (s, ZEBRA_NEXTHOP_IFINDEX);
  283.   stream_putl (s, api->ifindex[i]);
  284. }
  285.     }
  286.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_DISTANCE))
  287.     stream_putc (s, api->distance);
  288.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_METRIC))
  289.     stream_putl (s, api->metric);
  290.   /* Put length at the first point of the stream. */
  291.   stream_putw_at (s, 0, stream_get_endp (s));
  292.   return writen (zclient->sock, s->data, stream_get_endp (s));
  293. }
  294. int
  295. zapi_ipv4_delete (struct zclient *zclient, struct prefix_ipv4 *p,
  296.   struct zapi_ipv4 *api)
  297. {
  298.   int i;
  299.   int psize;
  300.   struct stream *s;
  301.   /* Reset stream. */
  302.   s = zclient->obuf;
  303.   stream_reset (s);
  304.   /* Length place holder. */
  305.   stream_putw (s, 0);
  306.   /* Put command, type and nexthop. */
  307.   stream_putc (s, ZEBRA_IPV4_ROUTE_DELETE);
  308.   stream_putc (s, api->type);
  309.   stream_putc (s, api->flags);
  310.   stream_putc (s, api->message);
  311.   
  312.   /* Put prefix information. */
  313.   psize = PSIZE (p->prefixlen);
  314.   stream_putc (s, p->prefixlen);
  315.   stream_write (s, (u_char *)&p->prefix, psize);
  316.   /* Nexthop, ifindex, distance and metric information. */
  317.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_NEXTHOP))
  318.     {
  319.       if (CHECK_FLAG (api->flags, ZEBRA_FLAG_BLACKHOLE))
  320. {
  321.   stream_putc (s, 1);
  322.   stream_putc (s, ZEBRA_NEXTHOP_BLACKHOLE);
  323. }
  324.       else
  325. stream_putc (s, api->nexthop_num + api->ifindex_num);
  326.       for (i = 0; i < api->nexthop_num; i++)
  327. {
  328.   stream_putc (s, ZEBRA_NEXTHOP_IPV4);
  329.   stream_put_in_addr (s, api->nexthop[i]);
  330. }
  331.       for (i = 0; i < api->ifindex_num; i++)
  332. {
  333.   stream_putc (s, ZEBRA_NEXTHOP_IFINDEX);
  334.   stream_putl (s, api->ifindex[i]);
  335. }
  336.     }
  337.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_DISTANCE))
  338.     stream_putc (s, api->distance);
  339.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_METRIC))
  340.     stream_putl (s, api->metric);
  341.   /* Put length at the first point of the stream. */
  342.   stream_putw_at (s, 0, stream_get_endp (s));
  343.   return writen (zclient->sock, s->data, stream_get_endp (s));
  344. }
  345. #ifdef HAVE_IPV6
  346. int
  347. zapi_ipv6_add (struct zclient *zclient, struct prefix_ipv6 *p,
  348.        struct zapi_ipv6 *api)
  349. {
  350.   int i;
  351.   int psize;
  352.   struct stream *s;
  353.   /* Reset stream. */
  354.   s = zclient->obuf;
  355.   stream_reset (s);
  356.   /* Length place holder. */
  357.   stream_putw (s, 0);
  358.   /* Put command, type and nexthop. */
  359.   stream_putc (s, ZEBRA_IPV6_ROUTE_ADD);
  360.   stream_putc (s, api->type);
  361.   stream_putc (s, api->flags);
  362.   stream_putc (s, api->message);
  363.   
  364.   /* Put prefix information. */
  365.   psize = PSIZE (p->prefixlen);
  366.   stream_putc (s, p->prefixlen);
  367.   stream_write (s, (u_char *)&p->prefix, psize);
  368.   /* Nexthop, ifindex, distance and metric information. */
  369.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_NEXTHOP))
  370.     {
  371.       stream_putc (s, api->nexthop_num + api->ifindex_num);
  372.       for (i = 0; i < api->nexthop_num; i++)
  373. {
  374.   stream_putc (s, ZEBRA_NEXTHOP_IPV6);
  375.   stream_write (s, (u_char *)api->nexthop[i], 16);
  376. }
  377.       for (i = 0; i < api->ifindex_num; i++)
  378. {
  379.   stream_putc (s, ZEBRA_NEXTHOP_IFINDEX);
  380.   stream_putl (s, api->ifindex[i]);
  381. }
  382.     }
  383.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_DISTANCE))
  384.     stream_putc (s, api->distance);
  385.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_METRIC))
  386.     stream_putl (s, api->metric);
  387.   /* Put length at the first point of the stream. */
  388.   stream_putw_at (s, 0, stream_get_endp (s));
  389.   return writen (zclient->sock, s->data, stream_get_endp (s));
  390. }
  391. int
  392. zapi_ipv6_delete (struct zclient *zclient, struct prefix_ipv6 *p,
  393.   struct zapi_ipv6 *api)
  394. {
  395.   int i;
  396.   int psize;
  397.   struct stream *s;
  398.   /* Reset stream. */
  399.   s = zclient->obuf;
  400.   stream_reset (s);
  401.   /* Length place holder. */
  402.   stream_putw (s, 0);
  403.   /* Put command, type and nexthop. */
  404.   stream_putc (s, ZEBRA_IPV6_ROUTE_DELETE);
  405.   stream_putc (s, api->type);
  406.   stream_putc (s, api->flags);
  407.   stream_putc (s, api->message);
  408.   
  409.   /* Put prefix information. */
  410.   psize = PSIZE (p->prefixlen);
  411.   stream_putc (s, p->prefixlen);
  412.   stream_write (s, (u_char *)&p->prefix, psize);
  413.   /* Nexthop, ifindex, distance and metric information. */
  414.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_NEXTHOP))
  415.     {
  416.       stream_putc (s, api->nexthop_num + api->ifindex_num);
  417.       for (i = 0; i < api->nexthop_num; i++)
  418. {
  419.   stream_putc (s, ZEBRA_NEXTHOP_IPV6);
  420.   stream_write (s, (u_char *)api->nexthop[i], 16);
  421. }
  422.       for (i = 0; i < api->ifindex_num; i++)
  423. {
  424.   stream_putc (s, ZEBRA_NEXTHOP_IFINDEX);
  425.   stream_putl (s, api->ifindex[i]);
  426. }
  427.     }
  428.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_DISTANCE))
  429.     stream_putc (s, api->distance);
  430.   if (CHECK_FLAG (api->message, ZAPI_MESSAGE_METRIC))
  431.     stream_putl (s, api->metric);
  432.   /* Put length at the first point of the stream. */
  433.   stream_putw_at (s, 0, stream_get_endp (s));
  434.   return writen (zclient->sock, s->data, stream_get_endp (s));
  435. }
  436. #endif /* HAVE_IPV6 */
  437. int
  438. zebra_redistribute_send (int command, int sock, int type)
  439. {
  440.   int ret;
  441.   struct stream *s;
  442.   s = stream_new (ZEBRA_MAX_PACKET_SIZ);
  443.   /* Total length of the messages. */
  444.   stream_putw (s, 4);
  445.   
  446.   stream_putc (s, command);
  447.   stream_putc (s, type);
  448.   ret = writen (sock, s->data, 4);
  449.   stream_free (s);
  450.   return ret;
  451. }
  452. /* Interface addition from zebra daemon. */
  453. struct interface *
  454. zebra_interface_add_read (struct stream *s)
  455. {
  456.   struct interface *ifp;
  457.   u_char ifname_tmp[INTERFACE_NAMSIZ];
  458.   /* Read interface name. */
  459.   stream_get (ifname_tmp, s, INTERFACE_NAMSIZ);
  460.   /* Lookup this by interface name. */
  461.   ifp = if_lookup_by_name (ifname_tmp);
  462.   /* If such interface does not exist, make new one. */
  463.   if (! ifp)
  464.     {
  465.       ifp = if_create ();
  466.       strncpy (ifp->name, ifname_tmp, IFNAMSIZ);
  467.     }
  468.   /* Read interface's index. */
  469.   ifp->ifindex = stream_getl (s);
  470.   /* Read interface's value. */
  471.   ifp->flags = stream_getl (s);
  472.   ifp->metric = stream_getl (s);
  473.   ifp->mtu = stream_getl (s);
  474.   ifp->bandwidth = stream_getl (s);
  475. #ifdef HAVE_SOCKADDR_DL
  476.   stream_get (&ifp->sdl, s, sizeof (ifp->sdl));
  477. #else
  478.   ifp->hw_addr_len = stream_getl (s);
  479.   if (ifp->hw_addr_len)
  480.     stream_get (ifp->hw_addr, s, ifp->hw_addr_len);
  481. #endif /* HAVE_SOCKADDR_DL */
  482.   
  483.   return ifp;
  484. }
  485. /* Read interface up/down msg from zebra daemon. */
  486. struct interface *
  487. zebra_interface_state_read (struct stream *s)
  488. {
  489.   struct interface *ifp;
  490.   u_char ifname_tmp[INTERFACE_NAMSIZ];
  491.   /* Read interface name. */
  492.   stream_get (ifname_tmp, s, INTERFACE_NAMSIZ);
  493.   /* Lookup this by interface index. */
  494.   ifp = if_lookup_by_name (ifname_tmp);
  495.   /* If such interface does not exist, indicate an error */
  496.   if (! ifp)
  497.      return NULL;
  498.   /* Read interface's index. */
  499.   ifp->ifindex = stream_getl (s);
  500.   /* Read interface's value. */
  501.   ifp->flags = stream_getl (s);
  502.   ifp->metric = stream_getl (s);
  503.   ifp->mtu = stream_getl (s);
  504.   ifp->bandwidth = stream_getl (s);
  505.   return ifp;
  506. }
  507. struct connected *
  508. zebra_interface_address_add_read (struct stream *s)
  509. {
  510.   unsigned int ifindex;
  511.   struct interface *ifp;
  512.   struct connected *ifc;
  513.   struct prefix *p;
  514.   int family;
  515.   int plen;
  516.   /* Get interface index. */
  517.   ifindex = stream_getl (s);
  518.   /* Lookup index. */
  519.   ifp = if_lookup_by_index (ifindex);
  520.   if (ifp == NULL)
  521.     {
  522.       zlog_warn ("zebra_interface_address_add_read: Can't find interface by ifindex: %d ", ifindex);
  523.       return NULL;
  524.     }
  525.   /* Allocate new connected address. */
  526.   ifc = connected_new ();
  527.   ifc->ifp = ifp;
  528.   /* Fetch flag. */
  529.   ifc->flags = stream_getc (s);
  530.   /* Fetch interface address. */
  531.   p = prefix_new ();
  532.   family = p->family = stream_getc (s);
  533.   plen = prefix_blen (p);
  534.   stream_get (&p->u.prefix, s, plen);
  535.   p->prefixlen = stream_getc (s);
  536.   ifc->address = p;
  537.   /* Fetch destination address. */
  538.   p = prefix_new ();
  539.   stream_get (&p->u.prefix, s, plen);
  540.   p->family = family;
  541.   ifc->destination = p;
  542.   p = ifc->address;
  543.   /* Add connected address to the interface. */
  544.   listnode_add (ifp->connected, ifc);
  545.   return ifc;
  546. }
  547. struct connected *
  548. zebra_interface_address_delete_read (struct stream *s)
  549. {
  550.   unsigned int ifindex;
  551.   struct interface *ifp;
  552.   struct connected *ifc;
  553.   struct prefix p;
  554.   struct prefix d;
  555.   int family;
  556.   int len;
  557.   u_char flags;
  558.   /* Get interface index. */
  559.   ifindex = stream_getl (s);
  560.   /* Lookup index. */
  561.   ifp = if_lookup_by_index (ifindex);
  562.   if (ifp == NULL)
  563.     {
  564.       zlog_warn ("zebra_interface_address_delete_read: Can't find interface by ifindex: %d ", ifindex);
  565.       return NULL;
  566.     }
  567.   /* Fetch flag. */
  568.   flags = stream_getc (s);
  569.   /* Fetch interface address. */
  570.   family = p.family = stream_getc (s);
  571.   len = prefix_blen (&p);
  572.   stream_get (&p.u.prefix, s, len);
  573.   p.prefixlen = stream_getc (s);
  574.   /* Fetch destination address. */
  575.   stream_get (&d.u.prefix, s, len);
  576.   d.family = family;
  577.   ifc = connected_delete_by_prefix (ifp, &p);
  578.   return ifc;
  579. }
  580. /* Zebra client message read function. */
  581. int
  582. zclient_read (struct thread *thread)
  583. {
  584.   int ret;
  585.   int nbytes;
  586.   int sock;
  587.   zebra_size_t length;
  588.   zebra_command_t command;
  589.   struct zclient *zclient;
  590.   /* Get socket to zebra. */
  591.   sock = THREAD_FD (thread);
  592.   zclient = THREAD_ARG (thread);
  593.   zclient->t_read = NULL;
  594.   /* Clear input buffer. */
  595.   stream_reset (zclient->ibuf);
  596.   /* Read zebra header. */
  597.   nbytes = stream_read (zclient->ibuf, sock, ZEBRA_HEADER_SIZE);
  598.   /* zebra socket is closed. */
  599.   if (nbytes == 0) 
  600.     {
  601.       if (zclient_debug)
  602. zlog_info ("zclient connection closed socket [%d].", sock);
  603.       zclient->fail++;
  604.       zclient_stop (zclient);
  605.       zclient_event (ZCLIENT_CONNECT, zclient);
  606.       return -1;
  607.     }
  608.   /* zebra read error. */
  609.   if (nbytes < 0 || nbytes != ZEBRA_HEADER_SIZE)
  610.     {
  611.       if (zclient_debug)
  612. zlog_info ("Can't read all packet (length %d).", nbytes);
  613.       zclient->fail++;
  614.       zclient_stop (zclient);
  615.       zclient_event (ZCLIENT_CONNECT, zclient);
  616.       return -1;
  617.     }
  618.   /* Fetch length and command. */
  619.   length = stream_getw (zclient->ibuf);
  620.   command = stream_getc (zclient->ibuf);
  621.   /* Length check. */
  622.   if (length >= zclient->ibuf->size)
  623.     {
  624.       stream_free (zclient->ibuf);
  625.       zclient->ibuf = stream_new (length + 1);
  626.     }
  627.   length -= ZEBRA_HEADER_SIZE;
  628.   /* Read rest of zebra packet. */
  629.   nbytes = stream_read (zclient->ibuf, sock, length);
  630.  if (nbytes != length)
  631.    {
  632.      if (zclient_debug)
  633.        zlog_info ("zclient connection closed socket [%d].", sock);
  634.      zclient->fail++;
  635.      zclient_stop (zclient);
  636.      zclient_event (ZCLIENT_CONNECT, zclient);
  637.      return -1;
  638.    }
  639.   switch (command)
  640.     {
  641.     case ZEBRA_INTERFACE_ADD:
  642.       if (zclient->interface_add)
  643. ret = (*zclient->interface_add) (command, zclient, length);
  644.       break;
  645.     case ZEBRA_INTERFACE_DELETE:
  646.       if (zclient->interface_delete)
  647. ret = (*zclient->interface_delete) (command, zclient, length);
  648.       break;
  649.     case ZEBRA_INTERFACE_ADDRESS_ADD:
  650.       if (zclient->interface_address_add)
  651. ret = (*zclient->interface_address_add) (command, zclient, length);
  652.       break;
  653.     case ZEBRA_INTERFACE_ADDRESS_DELETE:
  654.       if (zclient->interface_address_delete)
  655. ret = (*zclient->interface_address_delete) (command, zclient, length);
  656.       break;
  657.     case ZEBRA_INTERFACE_UP:
  658.       if (zclient->interface_up)
  659. ret = (*zclient->interface_up) (command, zclient, length);
  660.       break;
  661.     case ZEBRA_INTERFACE_DOWN:
  662.       if (zclient->interface_down)
  663. ret = (*zclient->interface_down) (command, zclient, length);
  664.       break;
  665.     case ZEBRA_IPV4_ROUTE_ADD:
  666.       if (zclient->ipv4_route_add)
  667. ret = (*zclient->ipv4_route_add) (command, zclient, length);
  668.       break;
  669.     case ZEBRA_IPV4_ROUTE_DELETE:
  670.       if (zclient->ipv4_route_delete)
  671. ret = (*zclient->ipv4_route_delete) (command, zclient, length);
  672.       break;
  673.     case ZEBRA_IPV6_ROUTE_ADD:
  674.       if (zclient->ipv6_route_add)
  675. ret = (*zclient->ipv6_route_add) (command, zclient, length);
  676.       break;
  677.     case ZEBRA_IPV6_ROUTE_DELETE:
  678.       if (zclient->ipv6_route_delete)
  679. ret = (*zclient->ipv6_route_delete) (command, zclient, length);
  680.       break;
  681.     default:
  682.       break;
  683.     }
  684.   /* Register read thread. */
  685.   zclient_event (ZCLIENT_READ, zclient);
  686.   return 0;
  687. }
  688. void
  689. zclient_redistribute_set (struct zclient *zclient, int type)
  690. {
  691.   if (zclient->redist[type])
  692.     return;
  693.   zclient->redist[type] = 1;
  694.   if (zclient->sock > 0)
  695.     zebra_redistribute_send (ZEBRA_REDISTRIBUTE_ADD, zclient->sock, type);
  696. }
  697. void
  698. zclient_redistribute_unset (struct zclient *zclient, int type)
  699. {
  700.   if (! zclient->redist[type])
  701.     return;
  702.   zclient->redist[type] = 0;
  703.   if (zclient->sock > 0)
  704.     zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient->sock, type);
  705. }
  706. void
  707. zclient_redistribute_default_set (struct zclient *zclient)
  708. {
  709.   if (zclient->default_information)
  710.     return;
  711.   zclient->default_information = 1;
  712.   if (zclient->sock > 0)
  713.     zebra_message_send (zclient, ZEBRA_REDISTRIBUTE_DEFAULT_ADD);
  714. }
  715. void
  716. zclient_redistribute_default_unset (struct zclient *zclient)
  717. {
  718.   if (! zclient->default_information)
  719.     return;
  720.   zclient->default_information = 0;
  721.   if (zclient->sock > 0)
  722.     zebra_message_send (zclient, ZEBRA_REDISTRIBUTE_DEFAULT_DELETE);
  723. }
  724. extern struct thread_master *master;
  725. static void
  726. zclient_event (enum event event, struct zclient *zclient)
  727. {
  728.   switch (event)
  729.     {
  730.     case ZCLIENT_SCHEDULE:
  731.       if (! zclient->t_connect)
  732. zclient->t_connect =
  733.   thread_add_event (master, zclient_connect, zclient, 0);
  734.       break;
  735.     case ZCLIENT_CONNECT:
  736.       if (zclient->fail >= 10)
  737. return;
  738.       if (zclient_debug)
  739. zlog_info ("zclient connect schedule interval is %d", 
  740.    zclient->fail < 3 ? 10 : 60);
  741.       if (! zclient->t_connect)
  742. zclient->t_connect = 
  743.   thread_add_timer (master, zclient_connect, zclient,
  744.     zclient->fail < 3 ? 10 : 60);
  745.       break;
  746.     case ZCLIENT_READ:
  747.       zclient->t_read = 
  748. thread_add_read (master, zclient_read, zclient, zclient->sock);
  749.       break;
  750.     }
  751. }