*/
#include <zebra.h>
+
+#ifdef HAVE_NETLINK
+
#include "zebra/rt.h"
#include "zebra/rt_netlink.h"
#include "zebra/zebra_mpls.h"
/*
* Install Label Forwarding entry into the kernel.
*/
-int
-kernel_add_lsp (zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_add_lsp(zebra_lsp_t *lsp)
{
- int ret;
+ int ret;
- if (!lsp || !lsp->best_nhlfe) // unexpected
- return -1;
+ if (!lsp || !lsp->best_nhlfe) { // unexpected
+ kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_INSTALL_FAILURE);
+ return ZEBRA_DPLANE_REQUEST_FAILURE;
+ }
- UNSET_FLAG (lsp->flags, LSP_FLAG_CHANGED);
- ret = netlink_mpls_multipath (RTM_NEWROUTE, lsp);
- if (!ret)
- SET_FLAG (lsp->flags, LSP_FLAG_INSTALLED);
- else
- clear_nhlfe_installed (lsp);
+ ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
- return ret;
+ kernel_lsp_pass_fail(lsp,
+ (!ret) ? ZEBRA_DPLANE_INSTALL_SUCCESS
+ : ZEBRA_DPLANE_INSTALL_FAILURE);
+
+ return ZEBRA_DPLANE_REQUEST_SUCCESS;
}
/*
* through the metric field (before kernel-MPLS). This shouldn't be an issue
* any longer, so REPLACE can be reintroduced.
*/
-int
-kernel_upd_lsp (zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_upd_lsp(zebra_lsp_t *lsp)
{
- int ret;
-
- if (!lsp || !lsp->best_nhlfe) // unexpected
- return -1;
+ int ret;
- UNSET_FLAG (lsp->flags, LSP_FLAG_CHANGED);
+ if (!lsp || !lsp->best_nhlfe) { // unexpected
+ kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_INSTALL_FAILURE);
+ return ZEBRA_DPLANE_REQUEST_FAILURE;
+ }
- /* First issue a DEL and clear the installed flag. */
- netlink_mpls_multipath (RTM_DELROUTE, lsp);
- UNSET_FLAG (lsp->flags, LSP_FLAG_INSTALLED);
+ ret = netlink_mpls_multipath(RTM_NEWROUTE, lsp);
- /* Then issue an ADD. */
- ret = netlink_mpls_multipath (RTM_NEWROUTE, lsp);
- if (!ret)
- SET_FLAG (lsp->flags, LSP_FLAG_INSTALLED);
- else
- clear_nhlfe_installed (lsp);
+ kernel_lsp_pass_fail(lsp,
+ (!ret) ? ZEBRA_DPLANE_INSTALL_SUCCESS
+ : ZEBRA_DPLANE_INSTALL_FAILURE);
- return ret;
+ return ZEBRA_DPLANE_REQUEST_SUCCESS;
}
/*
* Delete Label Forwarding entry from the kernel.
*/
-int
-kernel_del_lsp (zebra_lsp_t *lsp)
+enum zebra_dplane_result kernel_del_lsp(zebra_lsp_t *lsp)
{
- if (!lsp) // unexpected
- return -1;
+ int ret;
- if (CHECK_FLAG (lsp->flags, LSP_FLAG_INSTALLED))
- {
- netlink_mpls_multipath (RTM_DELROUTE, lsp);
- UNSET_FLAG (lsp->flags, LSP_FLAG_INSTALLED);
- }
+ if (!lsp) { // unexpected
+ kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_DELETE_FAILURE);
+ return ZEBRA_DPLANE_REQUEST_FAILURE;
+ }
- return 0;
+ if (!CHECK_FLAG(lsp->flags, LSP_FLAG_INSTALLED)) {
+ kernel_lsp_pass_fail(lsp, ZEBRA_DPLANE_DELETE_FAILURE);
+ return ZEBRA_DPLANE_REQUEST_FAILURE;
+ }
+
+ ret = netlink_mpls_multipath(RTM_DELROUTE, lsp);
+
+ kernel_lsp_pass_fail(lsp,
+ (!ret) ? ZEBRA_DPLANE_DELETE_SUCCESS
+ : ZEBRA_DPLANE_DELETE_FAILURE);
+
+ return ZEBRA_DPLANE_REQUEST_SUCCESS;
}
-int
-mpls_kernel_init (void)
+int mpls_kernel_init(void)
{
- struct stat st;
+ struct stat st;
- /*
- * Check if the MPLS module is loaded in the kernel.
- */
- if (stat ("/proc/sys/net/mpls", &st) != 0)
- return -1;
+ /*
+ * Check if the MPLS module is loaded in the kernel.
+ */
+ if (stat("/proc/sys/net/mpls", &st) != 0)
+ return -1;
- return 0;
+ return 0;
};
+
+#endif /* HAVE_NETLINK */