* 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
#include "openbsd-tree.h"
#include "linklist.h"
#include "qobj.h"
+#include "vty.h"
/* The default NS ID */
#define NS_DEFAULT 0
/* 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
#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
{
/* User data */
void *info;
+ /* The table_id from the kernel */
+ struct vrf_data data;
+
QOBJ_FIELDS
};
RB_HEAD (vrf_id_head, vrf);
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 (*)(struct vrf *));
-
extern struct vrf *vrf_lookup_by_id (vrf_id_t);
extern struct vrf *vrf_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) \
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
/*
* 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
*/