]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_msdp_socket.c
lib: enforce vrf_name_to_id by returning default_vrf when name is null
[mirror_frr.git] / pimd / pim_msdp_socket.c
index 9473462e6325ed08db0400d4266b41f0e970e7bb..7997d3138adf0380dd4895b1e97e5a31c4a3114a 100644 (file)
 #include <lib/vty.h>
 #include <lib/if.h>
 #include <lib/vrf.h>
+#include <lib/lib_errors.h>
 
 #include "pimd.h"
 #include "pim_sock.h"
+#include "pim_errors.h"
 
 #include "pim_msdp.h"
 #include "pim_msdp_socket.h"
@@ -41,16 +43,18 @@ static void pim_msdp_update_sock_send_buffer_size(int fd)
        socklen_t optlen = sizeof(optval);
 
        if (getsockopt(fd, SOL_SOCKET, SO_SNDBUF, &optval, &optlen) < 0) {
-               zlog_err("getsockopt of SO_SNDBUF failed %s\n",
-                        safe_strerror(errno));
+               flog_err_sys(EC_LIB_SOCKET,
+                            "getsockopt of SO_SNDBUF failed %s\n",
+                            safe_strerror(errno));
                return;
        }
 
        if (optval < size) {
                if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size))
                    < 0) {
-                       zlog_err("Couldn't increase send buffer: %s\n",
-                                safe_strerror(errno));
+                       flog_err_sys(EC_LIB_SOCKET,
+                                    "Couldn't increase send buffer: %s\n",
+                                    safe_strerror(errno));
                }
        }
 }
@@ -70,7 +74,8 @@ static int pim_msdp_sock_accept(struct thread *thread)
        /* re-register accept thread */
        accept_sock = THREAD_FD(thread);
        if (accept_sock < 0) {
-               zlog_err("accept_sock is negative value %d", accept_sock);
+               flog_err(EC_LIB_DEVELOPMENT, "accept_sock is negative value %d",
+                        accept_sock);
                return -1;
        }
        pim->msdp.listener.thread = NULL;
@@ -80,8 +85,8 @@ static int pim_msdp_sock_accept(struct thread *thread)
        /* accept client connection. */
        msdp_sock = sockunion_accept(accept_sock, &su);
        if (msdp_sock < 0) {
-               zlog_err("pim_msdp_sock_accept failed (%s)",
-                        safe_strerror(errno));
+               flog_err_sys(EC_LIB_SOCKET, "pim_msdp_sock_accept failed (%s)",
+                            safe_strerror(errno));
                return -1;
        }
 
@@ -90,7 +95,8 @@ static int pim_msdp_sock_accept(struct thread *thread)
        if (!mp || !PIM_MSDP_PEER_IS_LISTENER(mp)) {
                ++pim->msdp.rejected_accepts;
                if (PIM_DEBUG_MSDP_EVENTS) {
-                       zlog_err("msdp peer connection refused from %s",
+                       flog_err(EC_PIM_MSDP_PACKET,
+                                "msdp peer connection refused from %s",
                                 sockunion2str(&su, buf, SU_ADDRSTRLEN));
                }
                close(msdp_sock);
@@ -106,7 +112,7 @@ static int pim_msdp_sock_accept(struct thread *thread)
         * with this one */
        if (mp->fd >= 0) {
                if (PIM_DEBUG_MSDP_EVENTS) {
-                       zlog_err(
+                       zlog_notice(
                                "msdp peer new connection from %s stop old connection",
                                sockunion2str(&su, buf, SU_ADDRSTRLEN));
                }
@@ -135,7 +141,7 @@ int pim_msdp_sock_listen(struct pim_instance *pim)
 
        sock = socket(AF_INET, SOCK_STREAM, 0);
        if (sock < 0) {
-               zlog_err("socket: %s", safe_strerror(errno));
+               flog_err_sys(EC_LIB_SOCKET, "socket: %s", safe_strerror(errno));
                return sock;
        }
 
@@ -154,36 +160,38 @@ int pim_msdp_sock_listen(struct pim_instance *pim)
                struct interface *ifp =
                        if_lookup_by_name(pim->vrf->name, pim->vrf_id);
                if (!ifp) {
-                       zlog_err("%s: Unable to lookup vrf interface: %s",
+                       flog_err(EC_LIB_INTERFACE,
+                                "%s: Unable to lookup vrf interface: %s",
                                 __PRETTY_FUNCTION__, pim->vrf->name);
+                       close(sock);
+                       return -1;
+               }
+               if (pim_socket_bind(sock, ifp)) {
+                       flog_err_sys(EC_LIB_SOCKET,
+                                    "%s: Unable to bind to socket: %s",
+                                    __PRETTY_FUNCTION__, safe_strerror(errno));
+                       close(sock);
                        return -1;
                }
-               pim_socket_bind(sock, ifp);
        }
 
-       if (pimd_privs.change(ZPRIVS_RAISE)) {
-               zlog_err("pim_msdp_socket: could not raise privs, %s",
-                        safe_strerror(errno));
-       }
-
-       /* bind to well known TCP port */
-       rc = bind(sock, (struct sockaddr *)&sin, socklen);
-
-       if (pimd_privs.change(ZPRIVS_LOWER)) {
-               zlog_err("pim_msdp_socket: could not lower privs, %s",
-                        safe_strerror(errno));
+       frr_elevate_privs(&pimd_privs) {
+               /* bind to well known TCP port */
+               rc = bind(sock, (struct sockaddr *)&sin, socklen);
        }
 
        if (rc < 0) {
-               zlog_err("pim_msdp_socket bind to port %d: %s",
-                        ntohs(sin.sin_port), safe_strerror(errno));
+               flog_err_sys(EC_LIB_SOCKET,
+                            "pim_msdp_socket bind to port %d: %s",
+                            ntohs(sin.sin_port), safe_strerror(errno));
                close(sock);
                return rc;
        }
 
        rc = listen(sock, 3 /* backlog */);
        if (rc < 0) {
-               zlog_err("pim_msdp_socket listen: %s", safe_strerror(errno));
+               flog_err_sys(EC_LIB_SOCKET, "pim_msdp_socket listen: %s",
+                            safe_strerror(errno));
                close(sock);
                return rc;
        }
@@ -213,7 +221,7 @@ int pim_msdp_sock_connect(struct pim_msdp_peer *mp)
         * with this one */
        if (mp->fd >= 0) {
                if (PIM_DEBUG_MSDP_EVENTS) {
-                       zlog_err(
+                       zlog_notice(
                                "msdp duplicate connect to %s nuke old connection",
                                mp->key_str);
                }
@@ -223,8 +231,9 @@ int pim_msdp_sock_connect(struct pim_msdp_peer *mp)
        /* Make socket for the peer. */
        mp->fd = sockunion_socket(&mp->su_peer);
        if (mp->fd < 0) {
-               zlog_err("pim_msdp_socket socket failure: %s",
-                        safe_strerror(errno));
+               flog_err_sys(EC_LIB_SOCKET,
+                            "pim_msdp_socket socket failure: %s",
+                            safe_strerror(errno));
                return -1;
        }
 
@@ -232,11 +241,19 @@ int pim_msdp_sock_connect(struct pim_msdp_peer *mp)
                struct interface *ifp =
                        if_lookup_by_name(mp->pim->vrf->name, mp->pim->vrf_id);
                if (!ifp) {
-                       zlog_err("%s: Unable to lookup vrf interface: %s",
+                       flog_err(EC_LIB_INTERFACE,
+                                "%s: Unable to lookup vrf interface: %s",
                                 __PRETTY_FUNCTION__, mp->pim->vrf->name);
                        return -1;
                }
-               pim_socket_bind(mp->fd, ifp);
+               if (pim_socket_bind(mp->fd, ifp)) {
+                       flog_err_sys(EC_LIB_SOCKET,
+                                    "%s: Unable to bind to socket: %s",
+                                    __PRETTY_FUNCTION__, safe_strerror(errno));
+                       close(mp->fd);
+                       mp->fd = -1;
+                       return -1;
+               }
        }
 
        set_nonblocking(mp->fd);
@@ -249,8 +266,9 @@ int pim_msdp_sock_connect(struct pim_msdp_peer *mp)
        /* source bind */
        rc = sockunion_bind(mp->fd, &mp->su_local, 0, &mp->su_local);
        if (rc < 0) {
-               zlog_err("pim_msdp_socket connect bind failure: %s",
-                        safe_strerror(errno));
+               flog_err_sys(EC_LIB_SOCKET,
+                            "pim_msdp_socket connect bind failure: %s",
+                            safe_strerror(errno));
                close(mp->fd);
                mp->fd = -1;
                return rc;