]> git.proxmox.com Git - mirror_frr.git/blobdiff - pimd/pim_msdp_socket.c
zebra: Allow ns delete to happen after under/over flow checks
[mirror_frr.git] / pimd / pim_msdp_socket.c
index 5b1afb774b665da204cbdd3f568a93accc6d5f96..7997d3138adf0380dd4895b1e97e5a31c4a3114a 100644 (file)
@@ -30,6 +30,7 @@
 
 #include "pimd.h"
 #include "pim_sock.h"
+#include "pim_errors.h"
 
 #include "pim_msdp.h"
 #include "pim_msdp_socket.h"
@@ -42,17 +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_ferr(LIB_ERR_SOCKET, "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_ferr(LIB_ERR_SOCKET,
-                                 "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));
                }
        }
 }
@@ -72,8 +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_ferr(LIB_ERR_DEVELOPMENT,
-                         "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;
@@ -83,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_ferr(LIB_ERR_SOCKET, "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;
        }
 
@@ -93,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);
@@ -138,7 +141,7 @@ int pim_msdp_sock_listen(struct pim_instance *pim)
 
        sock = socket(AF_INET, SOCK_STREAM, 0);
        if (sock < 0) {
-               zlog_ferr(LIB_ERR_SOCKET, "socket: %s", safe_strerror(errno));
+               flog_err_sys(EC_LIB_SOCKET, "socket: %s", safe_strerror(errno));
                return sock;
        }
 
@@ -157,47 +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_ferr(LIB_ERR_INTERFACE,
-                                 "%s: Unable to lookup vrf interface: %s",
-                                 __PRETTY_FUNCTION__, pim->vrf->name);
+                       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)) {
-                       zlog_ferr(LIB_ERR_SOCKET,
-                                 "%s: Unable to bind to socket: %s",
-                                 __PRETTY_FUNCTION__, safe_strerror(errno));
+                       flog_err_sys(EC_LIB_SOCKET,
+                                    "%s: Unable to bind to socket: %s",
+                                    __PRETTY_FUNCTION__, safe_strerror(errno));
                        close(sock);
                        return -1;
                }
        }
 
-       if (pimd_privs.change(ZPRIVS_RAISE)) {
-               zlog_ferr(LIB_ERR_PRIVILEGES,
-                         "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_ferr(LIB_ERR_PRIVILEGES,
-                         "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_ferr(LIB_ERR_SOCKET, "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_ferr(LIB_ERR_SOCKET, "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;
        }
@@ -237,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_ferr(LIB_ERR_SOCKET, "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;
        }
 
@@ -246,15 +241,15 @@ 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_ferr(LIB_ERR_INTERFACE,
-                                 "%s: Unable to lookup vrf interface: %s",
-                                 __PRETTY_FUNCTION__, mp->pim->vrf->name);
+                       flog_err(EC_LIB_INTERFACE,
+                                "%s: Unable to lookup vrf interface: %s",
+                                __PRETTY_FUNCTION__, mp->pim->vrf->name);
                        return -1;
                }
                if (pim_socket_bind(mp->fd, ifp)) {
-                       zlog_ferr(LIB_ERR_SOCKET,
-                                 "%s: Unable to bind to socket: %s",
-                                 __PRETTY_FUNCTION__, safe_strerror(errno));
+                       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;
@@ -271,9 +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_ferr(LIB_ERR_SOCKET,
-                         "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;