diff options
Diffstat (limited to 'lib/vrf.c')
| -rw-r--r-- | lib/vrf.c | 103 |
1 files changed, 43 insertions, 60 deletions
@@ -14,16 +14,16 @@ * 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 */ #include <zebra.h> #include "if.h" #include "vrf.h" +#include "vrf_int.h" #include "prefix.h" #include "table.h" #include "log.h" @@ -237,33 +237,6 @@ vrf_disable (struct vrf *vrf) (*vrf_master.vrf_disable_hook) (vrf); } - -/* Add a VRF hook. Please add hooks before calling vrf_init(). */ -void -vrf_add_hook (int type, int (*func)(struct vrf *)) -{ - if (debug_vrf) - zlog_debug ("%s: Add Hook %d to function %p", __PRETTY_FUNCTION__, - type, func); - - switch (type) { - case VRF_NEW_HOOK: - vrf_master.vrf_new_hook = func; - break; - case VRF_DELETE_HOOK: - vrf_master.vrf_delete_hook = func; - break; - case VRF_ENABLE_HOOK: - vrf_master.vrf_enable_hook = func; - break; - case VRF_DISABLE_HOOK: - vrf_master.vrf_disable_hook = func; - break; - default: - break; - } -} - vrf_id_t vrf_name_to_id (const char *name) { @@ -309,24 +282,6 @@ vrf_iflist_get (vrf_id_t vrf_id) return vrf->iflist; } -/* Create the interface list for the specified VRF, if needed. */ -void -vrf_iflist_create (vrf_id_t vrf_id) -{ - struct vrf * vrf = vrf_lookup_by_id (vrf_id); - if (vrf && !vrf->iflist) - if_init (&vrf->iflist); -} - -/* Free the interface list of the specified VRF. */ -void -vrf_iflist_terminate (vrf_id_t vrf_id) -{ - struct vrf * vrf = vrf_lookup_by_id (vrf_id); - if (vrf && vrf->iflist) - if_terminate (&vrf->iflist); -} - /* * VRF bit-map */ @@ -424,13 +379,21 @@ vrf_bitmap_check (vrf_bitmap_t bmap, vrf_id_t vrf_id) /* Initialize VRF module. */ void -vrf_init (void) +vrf_init (int (*create)(struct vrf *), + int (*enable)(struct vrf *), + int (*disable)(struct vrf *), + int (*delete)(struct vrf *)) { struct vrf *default_vrf; if (debug_vrf) zlog_debug ("%s: Initializing VRF subsystem", __PRETTY_FUNCTION__); + vrf_master.vrf_new_hook = create; + vrf_master.vrf_enable_hook = enable; + vrf_master.vrf_disable_hook = disable; + vrf_master.vrf_delete_hook = delete; + /* The default VRF always exists. */ default_vrf = vrf_get (VRF_DEFAULT, VRF_DEFAULT_NAME); if (!default_vrf) @@ -474,26 +437,27 @@ vrf_socket (int domain, int type, int protocol, vrf_id_t vrf_id) } /* vrf CLI commands */ -DEFUN (vrf, +DEFUN_NOSH (vrf, vrf_cmd, "vrf NAME", "Select a VRF to configure\n" "VRF's name\n") { + int idx_name = 1; + const char *vrfname = argv[idx_name]->arg; struct vrf *vrfp; - size_t sl; - if ((sl = strlen(argv[0])) > VRF_NAMSIZ) + if (strlen(vrfname) > VRF_NAMSIZ) { vty_out (vty, "%% VRF name %s is invalid: length exceeds " - "%d characters%s", - argv[0], VRF_NAMSIZ, VTY_NEWLINE); + "%d characters%s", + vrfname, VRF_NAMSIZ, VTY_NEWLINE); return CMD_WARNING; } - vrfp = vrf_get (VRF_UNKNOWN, argv[0]); + vrfp = vrf_get (VRF_UNKNOWN, vrfname); - VTY_PUSH_CONTEXT_COMPAT (VRF_NODE, vrfp); + VTY_PUSH_CONTEXT (VRF_NODE, vrfp); return CMD_SUCCESS; } @@ -505,20 +469,22 @@ DEFUN_NOSH (no_vrf, "Delete a pseudo VRF's configuration\n" "VRF's name\n") { + const char *vrfname = argv[2]->arg; + struct vrf *vrfp; - vrfp = vrf_lookup_by_name (argv[0]); + vrfp = vrf_lookup_by_name (vrfname); if (vrfp == NULL) { - vty_out (vty, "%% VRF %s does not exist%s", argv[0], VTY_NEWLINE); + vty_out (vty, "%% VRF %s does not exist%s", vrfname, VTY_NEWLINE); return CMD_WARNING; } if (CHECK_FLAG (vrfp->status, VRF_ACTIVE)) { vty_out (vty, "%% Only inactive VRFs can be deleted%s", - VTY_NEWLINE); + VTY_NEWLINE); return CMD_WARNING; } @@ -527,6 +493,14 @@ DEFUN_NOSH (no_vrf, return CMD_SUCCESS; } + +struct cmd_node vrf_node = +{ + VRF_NODE, + "%s(config-vrf)# ", + 1 +}; + /* * Debug CLI for vrf's */ @@ -579,3 +553,12 @@ vrf_install_commands (void) install_element (CONFIG_NODE, &no_vrf_debug_cmd); install_element (ENABLE_NODE, &no_vrf_debug_cmd); } + +void +vrf_cmd_init (int (*writefunc)(struct vty *vty)) +{ + install_element (CONFIG_NODE, &vrf_cmd); + install_element (CONFIG_NODE, &no_vrf_cmd); + install_node (&vrf_node, writefunc); + install_default (VRF_NODE); +} |
