Diff for /embedaddon/quagga/ripngd/ripng_zebra.c between versions 1.1.1.2 and 1.1.1.3

version 1.1.1.2, 2012/10/09 09:22:29 version 1.1.1.3, 2016/11/02 10:09:12
Line 24 Line 24
   
 #include "command.h"  #include "command.h"
 #include "prefix.h"  #include "prefix.h"
   #include "table.h"
 #include "stream.h"  #include "stream.h"
   #include "memory.h"
 #include "routemap.h"  #include "routemap.h"
 #include "zclient.h"  #include "zclient.h"
 #include "log.h"  #include "log.h"
   
 #include "ripngd/ripngd.h"  #include "ripngd/ripngd.h"
   #include "ripngd/ripng_debug.h"
   
 /* All information about zebra. */  /* All information about zebra. */
 struct zclient *zclient = NULL;  struct zclient *zclient = NULL;
   
/* Callback prototypes for zebra client service. *//* Send ECMP routes to zebra. */
int ripng_interface_up (int, struct zclient *, zebra_size_t);static void
int ripng_interface_down (int, struct zclient *, zebra_size_t);ripng_zebra_ipv6_send (struct route_node *rp, u_char cmd)
int ripng_interface_add (int, struct zclient *, zebra_size_t); 
int ripng_interface_delete (int, struct zclient *, zebra_size_t); 
int ripng_interface_address_add (int, struct zclient *, zebra_size_t); 
int ripng_interface_address_delete (int, struct zclient *, zebra_size_t); 
 
void 
ripng_zebra_ipv6_add (struct prefix_ipv6 *p, struct in6_addr *nexthop, 
                      unsigned int ifindex, u_char metric) 
 {  {
     static struct in6_addr **nexthops = NULL;
     static ifindex_t *ifindexes = NULL;
     static unsigned int nexthops_len = 0;
   
     struct list *list = (struct list *)rp->info;
   struct zapi_ipv6 api;    struct zapi_ipv6 api;
     struct listnode *listnode = NULL;
     struct ripng_info *rinfo = NULL;
     int count = 0;
   
  if (zclient->redist[ZEBRA_ROUTE_RIPNG])  if (vrf_bitmap_check (zclient->redist[ZEBRA_ROUTE_RIPNG], VRF_DEFAULT))
     {      {
         api.vrf_id = VRF_DEFAULT;
       api.type = ZEBRA_ROUTE_RIPNG;        api.type = ZEBRA_ROUTE_RIPNG;
       api.flags = 0;        api.flags = 0;
       api.message = 0;        api.message = 0;
       api.safi = SAFI_UNICAST;        api.safi = SAFI_UNICAST;
   
         if (nexthops_len < listcount (list))
           {
             nexthops_len = listcount (list);
             nexthops = XREALLOC (MTYPE_TMP, nexthops,
                                  nexthops_len * sizeof (struct in6_addr *));
             ifindexes = XREALLOC (MTYPE_TMP, ifindexes,
                                   nexthops_len * sizeof (unsigned int));
           }
   
       SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);        SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP);
       api.nexthop_num = 1;  
       api.nexthop = &nexthop;  
       SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX);        SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX);
      api.ifindex_num = 1;      for (ALL_LIST_ELEMENTS_RO (list, listnode, rinfo))
      api.ifindex = &ifindex;        {
           nexthops[count] = &rinfo->nexthop;
           ifindexes[count] = rinfo->ifindex;
           count++;
           if (cmd == ZEBRA_IPV6_ROUTE_ADD)
             SET_FLAG (rinfo->flags, RIPNG_RTF_FIB);
           else
             UNSET_FLAG (rinfo->flags, RIPNG_RTF_FIB);
         }
 
       api.nexthop = nexthops;
       api.nexthop_num = count;
       api.ifindex = ifindexes;
       api.ifindex_num = count;
 
       rinfo = listgetdata (listhead (list));
 
       SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);        SET_FLAG (api.message, ZAPI_MESSAGE_METRIC);
      api.metric = metric;      api.metric = rinfo->metric;
      
      zapi_ipv6_route (ZEBRA_IPV6_ROUTE_ADD, zclient, p, &api);      zapi_ipv6_route (cmd, zclient,
                        (struct prefix_ipv6 *)&rp->p, &api);
 
       if (IS_RIPNG_DEBUG_ZEBRA)
         {
           if (ripng->ecmp)
             zlog_debug ("%s: %s/%d nexthops %d",
                         (cmd == ZEBRA_IPV6_ROUTE_ADD) ? \
                             "Install into zebra" : "Delete from zebra",
                         inet6_ntoa (rp->p.u.prefix6), rp->p.prefixlen, count);
           else
             zlog_debug ("%s: %s/%d",
                         (cmd == ZEBRA_IPV6_ROUTE_ADD) ? \
                             "Install into zebra" : "Delete from zebra",
                         inet6_ntoa (rp->p.u.prefix6), rp->p.prefixlen);
         }
     }      }
 }  }
   
   /* Add/update ECMP routes to zebra. */
 void  void
ripng_zebra_ipv6_delete (struct prefix_ipv6 *p, struct in6_addr *nexthop,ripng_zebra_ipv6_add (struct route_node *rp)
                         unsigned int ifindex) 
 {  {
  struct zapi_ipv6 api;  ripng_zebra_ipv6_send (rp, ZEBRA_IPV6_ROUTE_ADD);
 }
   
  if (zclient->redist[ZEBRA_ROUTE_RIPNG])/* Delete ECMP routes from zebra. */
    {void
      api.type = ZEBRA_ROUTE_RIPNG;ripng_zebra_ipv6_delete (struct route_node *rp)
      api.flags = 0;{
      api.message = 0;  ripng_zebra_ipv6_send (rp, ZEBRA_IPV6_ROUTE_DELETE);
      api.safi = SAFI_UNICAST; 
      SET_FLAG (api.message, ZAPI_MESSAGE_NEXTHOP); 
      api.nexthop_num = 1; 
      api.nexthop = &nexthop; 
      SET_FLAG (api.message, ZAPI_MESSAGE_IFINDEX); 
      api.ifindex_num = 1; 
      api.ifindex = &ifindex; 
 
      zapi_ipv6_route (ZEBRA_IPV6_ROUTE_DELETE, zclient, p, &api); 
    } 
 }  }
   
 /* Zebra route add and delete treatment. */  /* Zebra route add and delete treatment. */
 static int  static int
 ripng_zebra_read_ipv6 (int command, struct zclient *zclient,  ripng_zebra_read_ipv6 (int command, struct zclient *zclient,
                       zebra_size_t length)                       zebra_size_t length, vrf_id_t vrf_id)
 {  {
   struct stream *s;    struct stream *s;
   struct zapi_ipv6 api;    struct zapi_ipv6 api;
   unsigned long ifindex;    unsigned long ifindex;
   struct in6_addr nexthop;    struct in6_addr nexthop;
   struct prefix_ipv6 p;    struct prefix_ipv6 p;
     unsigned char plength = 0;
   
   s = zclient->ibuf;    s = zclient->ibuf;
   ifindex = 0;    ifindex = 0;
Line 113  ripng_zebra_read_ipv6 (int command, struct zclient *zc Line 148  ripng_zebra_read_ipv6 (int command, struct zclient *zc
   /* IPv6 prefix. */    /* IPv6 prefix. */
   memset (&p, 0, sizeof (struct prefix_ipv6));    memset (&p, 0, sizeof (struct prefix_ipv6));
   p.family = AF_INET6;    p.family = AF_INET6;
  p.prefixlen = stream_getc (s);  plength = stream_getc (s);
   p.prefixlen = MIN(IPV6_MAX_PREFIXLEN, plength);
   stream_get (&p.prefix, s, PSIZE (p.prefixlen));    stream_get (&p.prefix, s, PSIZE (p.prefixlen));
   
   /* Nexthop, ifindex, distance, metric. */    /* Nexthop, ifindex, distance, metric. */
Line 153  ripng_zclient_reset (void) Line 189  ripng_zclient_reset (void)
 static int  static int
 ripng_redistribute_unset (int type)  ripng_redistribute_unset (int type)
 {  {
  if (! zclient->redist[type])  if (! vrf_bitmap_check (zclient->redist[type], VRF_DEFAULT))
     return CMD_SUCCESS;      return CMD_SUCCESS;
   
  zclient->redist[type] = 0;  vrf_bitmap_set (zclient->redist[type], VRF_DEFAULT);
   
   if (zclient->sock > 0)    if (zclient->sock > 0)
    zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type);    zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE, zclient, type,
                              VRF_DEFAULT);
   
   ripng_redistribute_withdraw (type);    ripng_redistribute_withdraw (type);
       
Line 169  ripng_redistribute_unset (int type) Line 206  ripng_redistribute_unset (int type)
 int  int
 ripng_redistribute_check (int type)  ripng_redistribute_check (int type)
 {  {
  return (zclient->redist[type]);  return vrf_bitmap_check (zclient->redist[type], VRF_DEFAULT);
 }  }
   
 static void  static void
Line 206  ripng_redistribute_routemap_unset (int type) Line 243  ripng_redistribute_routemap_unset (int type)
   ripng->route_map[type].name = NULL;    ripng->route_map[type].name = NULL;
   ripng->route_map[type].map = NULL;    ripng->route_map[type].map = NULL;
 }  }
 /* Redistribution types */  /* Redistribution types */
 static struct {  static struct {
   int type;    int type;
Line 229  ripng_redistribute_clean () Line 266  ripng_redistribute_clean ()
   
   for (i = 0; redist_type[i].str; i++)    for (i = 0; redist_type[i].str; i++)
     {      {
      if (zclient->redist[redist_type[i].type])      if (vrf_bitmap_check (zclient->redist[redist_type[i].type], VRF_DEFAULT))
         {          {
           if (zclient->sock > 0)            if (zclient->sock > 0)
             zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE,              zebra_redistribute_send (ZEBRA_REDISTRIBUTE_DELETE,
                                     zclient, redist_type[i].type);                                     zclient, redist_type[i].type,
                                      VRF_DEFAULT);
   
          zclient->redist[redist_type[i].type] = 0;          vrf_bitmap_unset (zclient->redist[redist_type[i].type], VRF_DEFAULT);
   
           /* Remove the routes from RIPng table. */            /* Remove the routes from RIPng table. */
           ripng_redistribute_withdraw (redist_type[i].type);            ripng_redistribute_withdraw (redist_type[i].type);
Line 273  DEFUN (ripng_redistribute_ripng, Line 311  DEFUN (ripng_redistribute_ripng,
        "Redistribute information from another routing protocol\n"         "Redistribute information from another routing protocol\n"
        "RIPng route\n")         "RIPng route\n")
 {  {
  zclient->redist[ZEBRA_ROUTE_RIPNG] = 1;  vrf_bitmap_set (zclient->redist[ZEBRA_ROUTE_RIPNG], VRF_DEFAULT);
   return CMD_SUCCESS;    return CMD_SUCCESS;
 }  }
   
Line 284  DEFUN (no_ripng_redistribute_ripng, Line 322  DEFUN (no_ripng_redistribute_ripng,
        "Redistribute information from another routing protocol\n"         "Redistribute information from another routing protocol\n"
        "RIPng route\n")         "RIPng route\n")
 {  {
  zclient->redist[ZEBRA_ROUTE_RIPNG] = 0;  vrf_bitmap_unset (zclient->redist[ZEBRA_ROUTE_RIPNG], VRF_DEFAULT);
   return CMD_SUCCESS;    return CMD_SUCCESS;
 }  }
   
Line 304  DEFUN (ripng_redistribute_type, Line 342  DEFUN (ripng_redistribute_type,
       return CMD_WARNING;        return CMD_WARNING;
     }      }
   
  zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type);  zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type, VRF_DEFAULT);
   return CMD_SUCCESS;    return CMD_SUCCESS;
 }  }
   
Line 352  DEFUN (ripng_redistribute_type_metric, Line 390  DEFUN (ripng_redistribute_type_metric,
     }      }
   
   ripng_redistribute_metric_set (type, metric);    ripng_redistribute_metric_set (type, metric);
  zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type);  zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type, VRF_DEFAULT);
   return CMD_SUCCESS;    return CMD_SUCCESS;
 }  }
   
Line 384  DEFUN (ripng_redistribute_type_routemap, Line 422  DEFUN (ripng_redistribute_type_routemap,
     }      }
   
   ripng_redistribute_routemap_set (type, argv[1]);    ripng_redistribute_routemap_set (type, argv[1]);
  zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type);  zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type, VRF_DEFAULT);
  return CMD_SUCCESS;   return CMD_SUCCESS;
 }  }
   
Line 421  DEFUN (ripng_redistribute_type_metric_routemap, Line 459  DEFUN (ripng_redistribute_type_metric_routemap,
   
   ripng_redistribute_metric_set (type, metric);    ripng_redistribute_metric_set (type, metric);
   ripng_redistribute_routemap_set (type, argv[2]);    ripng_redistribute_routemap_set (type, argv[2]);
  zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type);  zclient_redistribute (ZEBRA_REDISTRIBUTE_ADD, zclient, type, VRF_DEFAULT);
   return CMD_SUCCESS;    return CMD_SUCCESS;
 }  }
   
Line 440  ripng_redistribute_write (struct vty *vty, int config_ Line 478  ripng_redistribute_write (struct vty *vty, int config_
   int i;    int i;
   
   for (i = 0; i < ZEBRA_ROUTE_MAX; i++)    for (i = 0; i < ZEBRA_ROUTE_MAX; i++)
    if (i != zclient->redist_default && zclient->redist[i])    if (i != zclient->redist_default &&
         vrf_bitmap_check (zclient->redist[i], VRF_DEFAULT))
       {        {
       if (config_mode)        if (config_mode)
         {          {
Line 480  zebra_config_write (struct vty *vty) Line 519  zebra_config_write (struct vty *vty)
       vty_out (vty, "no router zebra%s", VTY_NEWLINE);        vty_out (vty, "no router zebra%s", VTY_NEWLINE);
       return 1;        return 1;
     }      }
  else if (! zclient->redist[ZEBRA_ROUTE_RIPNG])  else if (! vrf_bitmap_check (zclient->redist[ZEBRA_ROUTE_RIPNG], VRF_DEFAULT))
     {      {
       vty_out (vty, "router zebra%s", VTY_NEWLINE);        vty_out (vty, "router zebra%s", VTY_NEWLINE);
       vty_out (vty, " no redistribute ripng%s", VTY_NEWLINE);        vty_out (vty, " no redistribute ripng%s", VTY_NEWLINE);
Line 496  static struct cmd_node zebra_node = Line 535  static struct cmd_node zebra_node =
   "%s(config-router)# ",    "%s(config-router)# ",
 };  };
   
   static void
   ripng_zebra_connected (struct zclient *zclient)
   {
     zclient_send_requests (zclient, VRF_DEFAULT);
   }
   
 /* Initialize zebra structure and it's commands. */  /* Initialize zebra structure and it's commands. */
 void  void
zebra_init ()zebra_init (struct thread_master *master)
 {  {
   /* Allocate zebra structure. */    /* Allocate zebra structure. */
  zclient = zclient_new ();  zclient = zclient_new (master);
   zclient_init (zclient, ZEBRA_ROUTE_RIPNG);    zclient_init (zclient, ZEBRA_ROUTE_RIPNG);
   
     zclient->zebra_connected = ripng_zebra_connected;
   zclient->interface_up = ripng_interface_up;    zclient->interface_up = ripng_interface_up;
   zclient->interface_down = ripng_interface_down;    zclient->interface_down = ripng_interface_down;
   zclient->interface_add = ripng_interface_add;    zclient->interface_add = ripng_interface_add;

Removed from v.1.1.1.2  
changed lines
  Added in v.1.1.1.3


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