]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/vrf.h
ospfd: fix route-map brokenness
[mirror_frr.git] / lib / vrf.h
index f1fbad9ff59ffb54121d6f5dc7d9de326a11cce9..d470349f00936ba9ac6516cb4ccddb3219759fb8 100644 (file)
--- a/lib/vrf.h
+++ b/lib/vrf.h
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with GNU Zebra; see the file COPYING.  If not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * You should have received a copy of the GNU General Public License along
+ * with this program; see the file COPYING; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #ifndef _ZEBRA_VRF_H
 #define _ZEBRA_VRF_H
 
+#include "openbsd-tree.h"
 #include "linklist.h"
 #include "qobj.h"
+#include "vty.h"
 
 /* The default NS ID */
 #define NS_DEFAULT 0
@@ -32,6 +33,7 @@
 /* The default VRF ID */
 #define VRF_DEFAULT 0
 #define VRF_UNKNOWN UINT16_MAX
+#define VRF_ALL UINT16_MAX - 1
 
 /* Pending: May need to refine this. */
 #ifndef IFLA_VRF_MAX
@@ -55,70 +57,63 @@ enum {
 #define VRF_ALL_CMD_HELP_STR    "Specify the VRF\nAll VRFs\n"
 
 /*
- * VRF hooks
+ * Pass some OS specific data up through
+ * to the daemons
  */
-
-#define VRF_NEW_HOOK        0   /* a new VRF is just created */
-#define VRF_DELETE_HOOK     1   /* a VRF is to be deleted */
-#define VRF_ENABLE_HOOK     2   /* a VRF is ready to use */
-#define VRF_DISABLE_HOOK    3   /* a VRF is to be unusable */
+struct vrf_data
+{
+  union
+  {
+    struct {
+      uint32_t table_id;
+    } l;
+  };
+};
 
 struct vrf
 {
+  RB_ENTRY(vrf) id_entry, name_entry;
+
   /* Identifier, same as the vector index */
   vrf_id_t vrf_id;
-  /* Name */
 
+  /* Name */
   char name[VRF_NAMSIZ + 1];
 
   /* Zebra internal VRF status */
   u_char status;
 #define VRF_ACTIVE     (1 << 0)
 
-  struct route_node *node;
-
   /* Master list of interfaces belonging to this VRF */
   struct list *iflist;
 
   /* User data */
   void *info;
 
+  /* The table_id from the kernel */
+  struct vrf_data data;
+
   QOBJ_FIELDS
 };
+RB_HEAD (vrf_id_head, vrf);
+RB_PROTOTYPE (vrf_id_head, vrf, id_entry, vrf_id_compare)
+RB_HEAD (vrf_name_head, vrf);
+RB_PROTOTYPE (vrf_name_head, vrf, name_entry, vrf_name_compare)
 DECLARE_QOBJ_TYPE(vrf)
 
 
-extern struct list *vrf_list;
+extern struct vrf_id_head vrfs_by_id;
+extern struct vrf_name_head vrfs_by_name;
 
-/*
- * Add a specific hook to VRF module.
- * @param1: hook type
- * @param2: the callback function
- *          - param 1: the VRF ID
- *          - param 2: the address of the user data pointer (the user data
- *                     can be stored in or freed from there)
- */
-extern void vrf_add_hook (int, int (*)(vrf_id_t, const char *, void **));
-
-/*
- * VRF iteration
- */
-
-typedef void *              vrf_iter_t;
-#define VRF_ITER_INVALID    NULL    /* invalid value of the iterator */
-
-extern struct vrf *vrf_lookup (vrf_id_t);
+extern struct vrf *vrf_lookup_by_id (vrf_id_t);
 extern struct vrf *vrf_lookup_by_name (const char *);
-extern struct vrf *vrf_list_lookup_by_name (const char *);
 extern struct vrf *vrf_get (vrf_id_t, const char *);
-extern void vrf_delete (struct vrf *);
-extern int vrf_enable (struct vrf *);
 extern vrf_id_t vrf_name_to_id (const char *);
 
 #define VRF_GET_ID(V,NAME)      \
   do {                          \
       struct vrf *vrf; \
-      if (!(vrf = vrf_list_lookup_by_name(NAME))) \
+      if (!(vrf = vrf_lookup_by_name(NAME))) \
         {                                                           \
           vty_out (vty, "%% VRF %s not found%s", NAME, VTY_NEWLINE);\
           return CMD_WARNING;                                       \
@@ -131,34 +126,6 @@ extern vrf_id_t vrf_name_to_id (const char *);
       (V) = vrf->vrf_id; \
   } while (0)
 
-/*
- * VRF iteration utilities. Example for the usage:
- *
- *   vrf_iter_t iter = vrf_first();
- *   for (; iter != VRF_ITER_INVALID; iter = vrf_next (iter))
- *
- * or
- *
- *   vrf_iter_t iter = vrf_iterator (<a given VRF ID>);
- *   for (; iter != VRF_ITER_INVALID; iter = vrf_next (iter))
- */
-
-/* Return the iterator of the first VRF. */
-extern vrf_iter_t vrf_first (void);
-/* Return the next VRF iterator to the given iterator. */
-extern vrf_iter_t vrf_next (vrf_iter_t);
-/* Return the VRF iterator of the given VRF ID. If it does not exist,
- * the iterator of the next existing VRF is returned. */
-extern vrf_iter_t vrf_iterator (vrf_id_t);
-
-/*
- * VRF iterator to properties
- */
-extern vrf_id_t vrf_iter2id (vrf_iter_t);
-extern struct vrf *vrf_iter2vrf (vrf_iter_t);
-extern void *vrf_iter2info (vrf_iter_t);
-extern struct list *vrf_iter2iflist (vrf_iter_t);
-
 /*
  * Utilities to obtain the user data
  */
@@ -176,10 +143,6 @@ extern void *vrf_info_lookup (vrf_id_t);
 extern struct list *vrf_iflist (vrf_id_t);
 /* Get the interface list of the specified VRF. Create one if not find. */
 extern struct list *vrf_iflist_get (vrf_id_t);
-/* Create the interface list for the specified VRF, if needed. */
-extern void vrf_iflist_create (vrf_id_t vrf_id);
-/* Free the interface list of the specified VRF. */
-extern void vrf_iflist_terminate (vrf_id_t vrf_id);
 
 /*
  * VRF bit-map: maintaining flags, one bit per VRF ID
@@ -196,11 +159,35 @@ extern int vrf_bitmap_check (vrf_bitmap_t, vrf_id_t);
 
 /*
  * VRF initializer/destructor
+ *
+ * create -> Called back when a new VRF is created.  This
+ *           can be either through these 3 options:
+ *           1) CLI mentions a vrf before OS knows about it
+ *           2) OS calls zebra and we create the vrf from OS
+ *              callback
+ *           3) zebra calls individual protocols to notify
+ *              about the new vrf
+ *
+ * enable -> Called back when a VRF is actually usable from
+ *           an OS perspective ( 2 and 3 above )
+ *
+ * disable -> Called back when a VRF is being deleted from
+ *            the system ( 2 and 3 ) above
+ *
+ * delete -> Called back when a vrf is being deleted from
+ *           the system ( 2 and 3 ) above.
+ */
+extern void vrf_init (int (*create)(struct vrf *),
+                     int (*enable)(struct vrf *),
+                     int (*disable)(struct vrf *),
+                     int (*delete)(struct vrf *));
+/*
+ * Call vrf_terminate when the protocol is being shutdown
  */
-/* Please add hooks before calling vrf_init(). */
-extern void vrf_init (void);
 extern void vrf_terminate (void);
 
+extern void vrf_cmd_init (int (*writefunc)(struct vty *vty));
+
 /*
  * VRF utilities
  */