]> git.proxmox.com Git - mirror_frr.git/blobdiff - zebra/zebra_mpls_openbsd.c
Merge pull request #5789 from donaldsharp/bgp_ebgp_reason
[mirror_frr.git] / zebra / zebra_mpls_openbsd.c
index da76c6ebf9249cc3fbfcffdf75aae1b2070e9511..5e18414985916d3d8a6e8549fe916289e8f1ef17 100644 (file)
@@ -27,6 +27,7 @@
 #include "zebra/zebra_mpls.h"
 #include "zebra/debug.h"
 #include "zebra/zebra_errors.h"
+#include "zebra/zebra_router.h"
 
 #include "privs.h"
 #include "prefix.h"
@@ -43,7 +44,7 @@ struct {
 } kr_state;
 
 static int kernel_send_rtmsg_v4(int action, mpls_label_t in_label,
-                               zebra_nhlfe_t *nhlfe)
+                               const zebra_nhlfe_t *nhlfe)
 {
        struct iovec iov[5];
        struct rt_msghdr hdr;
@@ -118,7 +119,7 @@ static int kernel_send_rtmsg_v4(int action, mpls_label_t in_label,
                        hdr.rtm_mpls = MPLS_OP_SWAP;
        }
 
-       frr_elevate_privs(&zserv_privs) {
+       frr_with_privs(&zserv_privs) {
                ret = writev(kr_state.fd, iov, iovcnt);
        }
 
@@ -135,7 +136,7 @@ static int kernel_send_rtmsg_v4(int action, mpls_label_t in_label,
 #endif
 
 static int kernel_send_rtmsg_v6(int action, mpls_label_t in_label,
-                               zebra_nhlfe_t *nhlfe)
+                               const zebra_nhlfe_t *nhlfe)
 {
        struct iovec iov[5];
        struct rt_msghdr hdr;
@@ -225,7 +226,7 @@ static int kernel_send_rtmsg_v6(int action, mpls_label_t in_label,
                        hdr.rtm_mpls = MPLS_OP_SWAP;
        }
 
-       frr_elevate_privs(&zserv_privs) {
+       frr_with_privs(&zserv_privs) {
                ret = writev(kr_state.fd, iov, iovcnt);
        }
 
@@ -238,7 +239,7 @@ static int kernel_send_rtmsg_v6(int action, mpls_label_t in_label,
 
 static int kernel_lsp_cmd(struct zebra_dplane_ctx *ctx)
 {
-       zebra_nhlfe_t *nhlfe;
+       const zebra_nhlfe_t *nhlfe;
        struct nexthop *nexthop = NULL;
        unsigned int nexthop_num = 0;
        int action;
@@ -262,7 +263,7 @@ static int kernel_lsp_cmd(struct zebra_dplane_ctx *ctx)
                if (!nexthop)
                        continue;
 
-               if (nexthop_num >= multipath_num)
+               if (nexthop_num >= zrouter.multipath_num)
                        break;
 
                if (((action == RTM_ADD || action == RTM_CHANGE)
@@ -301,7 +302,7 @@ static int kernel_lsp_cmd(struct zebra_dplane_ctx *ctx)
                }
        }
 
-       return (0);
+       return 0;
 }
 
 enum zebra_dplane_result kernel_lsp_update(struct zebra_dplane_ctx *ctx)
@@ -314,16 +315,17 @@ enum zebra_dplane_result kernel_lsp_update(struct zebra_dplane_ctx *ctx)
                ZEBRA_DPLANE_REQUEST_SUCCESS : ZEBRA_DPLANE_REQUEST_FAILURE);
 }
 
-static int kmpw_install(struct zebra_pw *pw)
+static enum zebra_dplane_result kmpw_install(struct zebra_dplane_ctx *ctx)
 {
        struct ifreq ifr;
        struct ifmpwreq imr;
        struct sockaddr_storage ss;
        struct sockaddr_in *sa_in = (struct sockaddr_in *)&ss;
        struct sockaddr_in6 *sa_in6 = (struct sockaddr_in6 *)&ss;
+       const union g_addr *gaddr;
 
        memset(&imr, 0, sizeof(imr));
-       switch (pw->type) {
+       switch (dplane_ctx_get_pw_type(ctx)) {
        case PW_TYPE_ETHERNET:
                imr.imr_type = IMR_TYPE_ETHERNET;
                break;
@@ -332,67 +334,91 @@ static int kmpw_install(struct zebra_pw *pw)
                break;
        default:
                zlog_debug("%s: unhandled pseudowire type (%#X)", __func__,
-                          pw->type);
-               return -1;
+                          dplane_ctx_get_pw_type(ctx));
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
-       if (pw->flags & F_PSEUDOWIRE_CWORD)
+       if (dplane_ctx_get_pw_flags(ctx) & F_PSEUDOWIRE_CWORD)
                imr.imr_flags |= IMR_FLAG_CONTROLWORD;
 
        /* pseudowire nexthop */
        memset(&ss, 0, sizeof(ss));
-       switch (pw->af) {
+       gaddr = dplane_ctx_get_pw_dest(ctx);
+       switch (dplane_ctx_get_pw_af(ctx)) {
        case AF_INET:
                sa_in->sin_family = AF_INET;
                sa_in->sin_len = sizeof(struct sockaddr_in);
-               sa_in->sin_addr = pw->nexthop.ipv4;
+               sa_in->sin_addr = gaddr->ipv4;
                break;
        case AF_INET6:
                sa_in6->sin6_family = AF_INET6;
                sa_in6->sin6_len = sizeof(struct sockaddr_in6);
-               sa_in6->sin6_addr = pw->nexthop.ipv6;
+               sa_in6->sin6_addr = gaddr->ipv6;
                break;
        default:
                zlog_debug("%s: unhandled pseudowire address-family (%u)",
-                          __func__, pw->af);
-               return -1;
+                          __func__, dplane_ctx_get_pw_af(ctx));
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
        memcpy(&imr.imr_nexthop, (struct sockaddr *)&ss,
               sizeof(imr.imr_nexthop));
 
        /* pseudowire local/remote labels */
-       imr.imr_lshim.shim_label = pw->local_label;
-       imr.imr_rshim.shim_label = pw->remote_label;
+       imr.imr_lshim.shim_label = dplane_ctx_get_pw_local_label(ctx);
+       imr.imr_rshim.shim_label = dplane_ctx_get_pw_remote_label(ctx);
 
        /* ioctl */
        memset(&ifr, 0, sizeof(ifr));
-       strlcpy(ifr.ifr_name, pw->ifname, sizeof(ifr.ifr_name));
+       strlcpy(ifr.ifr_name, dplane_ctx_get_ifname(ctx),
+               sizeof(ifr.ifr_name));
        ifr.ifr_data = (caddr_t)&imr;
        if (ioctl(kr_state.ioctl_fd, SIOCSETMPWCFG, &ifr) == -1) {
                flog_err_sys(EC_LIB_SYSTEM_CALL, "ioctl SIOCSETMPWCFG: %s",
                             safe_strerror(errno));
-               return -1;
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
-       return 0;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
 }
 
-static int kmpw_uninstall(struct zebra_pw *pw)
+static enum zebra_dplane_result kmpw_uninstall(struct zebra_dplane_ctx *ctx)
 {
        struct ifreq ifr;
        struct ifmpwreq imr;
 
        memset(&ifr, 0, sizeof(ifr));
        memset(&imr, 0, sizeof(imr));
-       strlcpy(ifr.ifr_name, pw->ifname, sizeof(ifr.ifr_name));
+       strlcpy(ifr.ifr_name, dplane_ctx_get_ifname(ctx),
+               sizeof(ifr.ifr_name));
        ifr.ifr_data = (caddr_t)&imr;
        if (ioctl(kr_state.ioctl_fd, SIOCSETMPWCFG, &ifr) == -1) {
                flog_err_sys(EC_LIB_SYSTEM_CALL, "ioctl SIOCSETMPWCFG: %s",
                             safe_strerror(errno));
-               return -1;
+               return ZEBRA_DPLANE_REQUEST_FAILURE;
        }
 
-       return 0;
+       return ZEBRA_DPLANE_REQUEST_SUCCESS;
+}
+
+/*
+ * Pseudowire update api for openbsd.
+ */
+enum zebra_dplane_result kernel_pw_update(struct zebra_dplane_ctx *ctx)
+{
+       enum zebra_dplane_result result = ZEBRA_DPLANE_REQUEST_FAILURE;
+
+       switch (dplane_ctx_get_op(ctx)) {
+       case DPLANE_OP_PW_INSTALL:
+               result = kmpw_install(ctx);
+               break;
+       case DPLANE_OP_PW_UNINSTALL:
+               result = kmpw_uninstall(ctx);
+               break;
+       default:
+               break;
+       }
+
+       return result;
 }
 
 #define MAX_RTSOCK_BUF 128 * 1024
@@ -431,10 +457,6 @@ int mpls_kernel_init(void)
 
        kr_state.rtseq = 1;
 
-       /* register hook to install/uninstall pseudowires */
-       hook_register(pw_install, kmpw_install);
-       hook_register(pw_uninstall, kmpw_uninstall);
-
        return 0;
 }