]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/rfapi/vnc_export_table.c
Merge pull request #11485 from AbhishekNR/ipv6_mld_todo
[mirror_frr.git] / bgpd / rfapi / vnc_export_table.c
index 5c7a64d3bb13259592f641d0652e51cf76449fa1..743576d2654ec8c466873c24ef5e99483cd1d7b0 100644 (file)
@@ -1,4 +1,4 @@
-/* 
+/*
  *
  * Copyright 2009-2016, LabN Consulting, L.L.C.
  *
@@ -21,7 +21,7 @@
 
 #include "lib/zebra.h"
 #include "lib/prefix.h"
-#include "lib/table.h"
+#include "lib/agg_table.h"
 #include "lib/memory.h"
 #include "lib/vty.h"
 
 #include "bgpd/rfapi/rfapi_import.h"
 #include "bgpd/rfapi/vnc_debug.h"
 
-struct route_node *
-vnc_etn_get (struct bgp *bgp, vnc_export_type_t type, struct prefix *p)
+struct agg_node *vnc_etn_get(struct bgp *bgp, vnc_export_type_t type,
+                            const struct prefix *p)
 {
-  struct route_table *t = NULL;
-  struct route_node *rn = NULL;
-  afi_t afi;
-
-  if (!bgp || !bgp->rfapi)
-    return NULL;
-
-  afi = family2afi (p->family);
-  assert (afi == AFI_IP || afi == AFI_IP6);
-
-  switch (type)
-    {
-    case EXPORT_TYPE_BGP:
-      if (!bgp->rfapi->rt_export_bgp[afi])
-        bgp->rfapi->rt_export_bgp[afi] = route_table_init ();
-      t = bgp->rfapi->rt_export_bgp[afi];
-      break;
-
-    case EXPORT_TYPE_ZEBRA:
-      if (!bgp->rfapi->rt_export_zebra[afi])
-        bgp->rfapi->rt_export_zebra[afi] = route_table_init ();
-      t = bgp->rfapi->rt_export_zebra[afi];
-      break;
-    }
-
-  if (t)
-    rn = route_node_get (t, p);
-  return rn;
+       struct agg_table *t = NULL;
+       struct agg_node *rn = NULL;
+       afi_t afi;
+
+       if (!bgp || !bgp->rfapi)
+               return NULL;
+
+       afi = family2afi(p->family);
+       assert(afi == AFI_IP || afi == AFI_IP6);
+
+       switch (type) {
+       case EXPORT_TYPE_BGP:
+               if (!bgp->rfapi->rt_export_bgp[afi])
+                       bgp->rfapi->rt_export_bgp[afi] = agg_table_init();
+               t = bgp->rfapi->rt_export_bgp[afi];
+               break;
+
+       case EXPORT_TYPE_ZEBRA:
+               if (!bgp->rfapi->rt_export_zebra[afi])
+                       bgp->rfapi->rt_export_zebra[afi] = agg_table_init();
+               t = bgp->rfapi->rt_export_zebra[afi];
+               break;
+       }
+
+       if (t)
+               rn = agg_node_get(t, p);
+       return rn;
 }
 
-struct route_node *
-vnc_etn_lookup (struct bgp *bgp, vnc_export_type_t type, struct prefix *p)
+struct agg_node *vnc_etn_lookup(struct bgp *bgp, vnc_export_type_t type,
+                               const struct prefix *p)
 {
-  struct route_table *t = NULL;
-  struct route_node *rn = NULL;
-  afi_t afi;
-
-  if (!bgp || !bgp->rfapi)
-    return NULL;
-
-  afi = family2afi (p->family);
-  assert (afi == AFI_IP || afi == AFI_IP6);
-
-  switch (type)
-    {
-    case EXPORT_TYPE_BGP:
-      if (!bgp->rfapi->rt_export_bgp[afi])
-        bgp->rfapi->rt_export_bgp[afi] = route_table_init ();
-      t = bgp->rfapi->rt_export_bgp[afi];
-      break;
-
-    case EXPORT_TYPE_ZEBRA:
-      if (!bgp->rfapi->rt_export_zebra[afi])
-        bgp->rfapi->rt_export_zebra[afi] = route_table_init ();
-      t = bgp->rfapi->rt_export_zebra[afi];
-      break;
-    }
-
-  if (t)
-    rn = route_node_lookup (t, p);
-  return rn;
+       struct agg_table *t = NULL;
+       struct agg_node *rn = NULL;
+       afi_t afi;
+
+       if (!bgp || !bgp->rfapi)
+               return NULL;
+
+       afi = family2afi(p->family);
+       assert(afi == AFI_IP || afi == AFI_IP6);
+
+       switch (type) {
+       case EXPORT_TYPE_BGP:
+               if (!bgp->rfapi->rt_export_bgp[afi])
+                       bgp->rfapi->rt_export_bgp[afi] = agg_table_init();
+               t = bgp->rfapi->rt_export_bgp[afi];
+               break;
+
+       case EXPORT_TYPE_ZEBRA:
+               if (!bgp->rfapi->rt_export_zebra[afi])
+                       bgp->rfapi->rt_export_zebra[afi] = agg_table_init();
+               t = bgp->rfapi->rt_export_zebra[afi];
+               break;
+       }
+
+       if (t)
+               rn = agg_node_lookup(t, p);
+       return rn;
 }
 
-struct vnc_export_info *
-vnc_eti_get (
-    struct bgp         *bgp,
-    vnc_export_type_t  etype,
-    struct prefix      *p,
-    struct peer                *peer,
-    uint8_t            type,
-    uint8_t            subtype)
+struct vnc_export_info *vnc_eti_get(struct bgp *bgp, vnc_export_type_t etype,
+                                   const struct prefix *p, struct peer *peer,
+                                   uint8_t type, uint8_t subtype)
 {
-  struct route_node *etn;
-  struct vnc_export_info *eti;
-
-  etn = vnc_etn_get (bgp, etype, p);
-  assert (etn);
-
-  for (eti = etn->info; eti; eti = eti->next)
-    {
-      if (peer == eti->peer && type == eti->type && subtype == eti->subtype)
-        {
-
-          break;
-        }
-    }
-
-  if (eti)
-    {
-      route_unlock_node (etn);
-    }
-  else
-    {
-      eti = XCALLOC (MTYPE_RFAPI_ETI, sizeof (struct vnc_export_info));
-      assert (eti);
-      eti->node = etn;
-      eti->peer = peer;
-      peer_lock (peer);
-      eti->type = type;
-      eti->subtype = subtype;
-      eti->next = etn->info;
-      etn->info = eti;
-    }
-
-  return eti;
+       struct agg_node *etn;
+       struct vnc_export_info *eti;
+
+       etn = vnc_etn_get(bgp, etype, p);
+       assert(etn);
+
+       for (eti = etn->info; eti; eti = eti->next) {
+               if (peer == eti->peer && type == eti->type
+                   && subtype == eti->subtype) {
+
+                       break;
+               }
+       }
+
+       if (eti) {
+               agg_unlock_node(etn);
+       } else {
+               eti = XCALLOC(MTYPE_RFAPI_ETI, sizeof(struct vnc_export_info));
+               eti->node = etn;
+               eti->peer = peer;
+               peer_lock(peer);
+               eti->type = type;
+               eti->subtype = subtype;
+               eti->next = etn->info;
+               etn->info = eti;
+       }
+
+       return eti;
 }
 
-void
-vnc_eti_delete (struct vnc_export_info *goner)
+void vnc_eti_delete(struct vnc_export_info *goner)
 {
-  struct route_node *etn;
-  struct vnc_export_info *eti;
-  struct vnc_export_info *eti_prev = NULL;
-
-  etn = goner->node;
-
-  for (eti = etn->info; eti; eti_prev = eti, eti = eti->next)
-    {
-      if (eti == goner)
-        break;
-    }
-
-  if (!eti)
-    {
-      vnc_zlog_debug_verbose ("%s: COULDN'T FIND ETI", __func__);
-      return;
-    }
-
-  if (eti_prev)
-    {
-      eti_prev->next = goner->next;
-    }
-  else
-    {
-      etn->info = goner->next;
-    }
-
-  peer_unlock (eti->peer);
-  goner->node = NULL;
-  XFREE (MTYPE_RFAPI_ETI, goner);
-
-  route_unlock_node (etn);
+       struct agg_node *etn;
+       struct vnc_export_info *eti;
+       struct vnc_export_info *eti_prev = NULL;
+
+       etn = goner->node;
+
+       for (eti = etn->info; eti; eti_prev = eti, eti = eti->next) {
+               if (eti == goner)
+                       break;
+       }
+
+       if (!eti) {
+               vnc_zlog_debug_verbose("%s: COULDN'T FIND ETI", __func__);
+               return;
+       }
+
+       if (eti_prev) {
+               eti_prev->next = goner->next;
+       } else {
+               etn->info = goner->next;
+       }
+
+       peer_unlock(eti->peer);
+       goner->node = NULL;
+       XFREE(MTYPE_RFAPI_ETI, goner);
+
+       agg_unlock_node(etn);
 }
 
-struct vnc_export_info *
-vnc_eti_checktimer (
-    struct bgp         *bgp,
-    vnc_export_type_t  etype,
-    struct prefix      *p,
-    struct peer                *peer,
-    uint8_t            type,
-    uint8_t            subtype)
+struct vnc_export_info *vnc_eti_checktimer(struct bgp *bgp,
+                                          vnc_export_type_t etype,
+                                          const struct prefix *p,
+                                          struct peer *peer, uint8_t type,
+                                          uint8_t subtype)
 {
-  struct route_node *etn;
-  struct vnc_export_info *eti;
+       struct agg_node *etn;
+       struct vnc_export_info *eti;
 
-  etn = vnc_etn_lookup (bgp, etype, p);
-  if (!etn)
-    return NULL;
+       etn = vnc_etn_lookup(bgp, etype, p);
+       if (!etn)
+               return NULL;
 
-  for (eti = etn->info; eti; eti = eti->next)
-    {
-      if (peer == eti->peer && type == eti->type && subtype == eti->subtype)
-        {
+       for (eti = etn->info; eti; eti = eti->next) {
+               if (peer == eti->peer && type == eti->type
+                   && subtype == eti->subtype) {
 
-          break;
-        }
-    }
+                       break;
+               }
+       }
 
-  route_unlock_node (etn);
+       agg_unlock_node(etn);
 
-  if (eti && eti->timer)
-    return eti;
+       if (eti && eti->timer)
+               return eti;
 
-  return NULL;
+       return NULL;
 }