]> git.proxmox.com Git - mirror_frr.git/blobdiff - bgpd/bgp_network.c
*: remove the configuration lock from all daemons
[mirror_frr.git] / bgpd / bgp_network.c
index 0664fdfd1cdd720ebe67b9f2993a8e906b14f847..e15b8f4ec38c356d7a418872e23fdc0d3d81bf47 100644 (file)
@@ -36,6 +36,7 @@
 #include "filter.h"
 #include "ns.h"
 #include "lib_errors.h"
+#include "nexthop.h"
 
 #include "bgpd/bgpd.h"
 #include "bgpd/bgp_open.h"
@@ -44,6 +45,7 @@
 #include "bgpd/bgp_debug.h"
 #include "bgpd/bgp_errors.h"
 #include "bgpd/bgp_network.h"
+#include "bgpd/bgp_zebra.h"
 
 extern struct zebra_privs_t bgpd_privs;
 
@@ -84,7 +86,8 @@ static int bgp_md5_set_socket(int socket, union sockunion *su,
 #endif /* HAVE_TCP_MD5SIG */
 
        if (ret < 0)
-               zlog_warn("can't set TCP_MD5SIG option on socket %d: %s",
+               flog_warn(EC_BGP_NO_TCP_MD5,
+                         "can't set TCP_MD5SIG option on socket %d: %s",
                          socket, safe_strerror(en));
 
        return ret;
@@ -148,7 +151,7 @@ int bgp_set_socket_ttl(struct peer *peer, int bgp_sock)
                ret = sockopt_ttl(peer->su.sa.sa_family, bgp_sock, peer->ttl);
                if (ret) {
                        flog_err(
-                               LIB_ERR_SOCKET,
+                               EC_LIB_SOCKET,
                                "%s: Can't set TxTTL on peer (rtrid %s) socket, err = %d",
                                __func__,
                                inet_ntop(AF_INET, &peer->remote_id, buf,
@@ -164,7 +167,7 @@ int bgp_set_socket_ttl(struct peer *peer, int bgp_sock)
                ret = sockopt_ttl(peer->su.sa.sa_family, bgp_sock, MAXTTL);
                if (ret) {
                        flog_err(
-                               LIB_ERR_SOCKET,
+                               EC_LIB_SOCKET,
                                "%s: Can't set TxTTL on peer (rtrid %s) socket, err = %d",
                                __func__,
                                inet_ntop(AF_INET, &peer->remote_id, buf,
@@ -176,7 +179,7 @@ int bgp_set_socket_ttl(struct peer *peer, int bgp_sock)
                                     MAXTTL + 1 - peer->gtsm_hops);
                if (ret) {
                        flog_err(
-                               LIB_ERR_SOCKET,
+                               EC_LIB_SOCKET,
                                "%s: Can't set MinTTL on peer (rtrid %s) socket, err = %d",
                                __func__,
                                inet_ntop(AF_INET, &peer->remote_id, buf,
@@ -221,10 +224,9 @@ static int bgp_get_instance_for_inc_conn(int sock, struct bgp **bgp_inst)
        rc = getsockopt(sock, SOL_SOCKET, SO_BINDTODEVICE, name, &name_len);
        if (rc != 0) {
 #if defined(HAVE_CUMULUS)
-               flog_err(
-                       LIB_ERR_SOCKET,
-                       "[Error] BGP SO_BINDTODEVICE get failed (%s), sock %d",
-                       safe_strerror(errno), sock);
+               flog_err(EC_LIB_SOCKET,
+                        "[Error] BGP SO_BINDTODEVICE get failed (%s), sock %d",
+                        safe_strerror(errno), sock);
                return -1;
 #endif
        }
@@ -279,7 +281,7 @@ static int bgp_accept(struct thread *thread)
        /* Register accept thread. */
        accept_sock = THREAD_FD(thread);
        if (accept_sock < 0) {
-               flog_err_sys(LIB_ERR_SOCKET, "accept_sock is nevative value %d",
+               flog_err_sys(EC_LIB_SOCKET, "accept_sock is nevative value %d",
                             accept_sock);
                return -1;
        }
@@ -291,7 +293,7 @@ static int bgp_accept(struct thread *thread)
        /* Accept client connection. */
        bgp_sock = sockunion_accept(accept_sock, &su);
        if (bgp_sock < 0) {
-               flog_err_sys(LIB_ERR_SOCKET,
+               flog_err_sys(EC_LIB_SOCKET,
                             "[Error] BGP socket accept failed (%s)",
                             safe_strerror(errno));
                return -1;
@@ -404,7 +406,6 @@ static int bgp_accept(struct thread *thread)
 
        peer = peer_create(&su, peer1->conf_if, peer1->bgp, peer1->local_as,
                           peer1->as, peer1->as_type, 0, 0, NULL);
-       peer->su = su;
        hash_release(peer->bgp->peerhash, peer);
        hash_get(peer->bgp->peerhash, peer, hash_alloc_intern);
 
@@ -561,7 +562,8 @@ int bgp_connect(struct peer *peer)
        sockopt_reuseaddr(peer->fd);
        sockopt_reuseport(peer->fd);
        if (sockopt_mark_default(peer->fd, DATAPLANE_MARK, &bgpd_privs) < 0)
-               zlog_warn("Unable to set mark on FD for peer %s, err=%s",
+               flog_warn(EC_BGP_NO_SOCKOPT_MARK,
+                         "Unable to set mark on FD for peer %s, err=%s",
                          peer->host, safe_strerror(errno));
 
 #ifdef IPTOS_PREC_INTERNETCONTROL
@@ -617,15 +619,12 @@ int bgp_getsockname(struct peer *peer)
        if (!peer->su_remote)
                return -1;
 
-       if (bgp_nexthop_set(peer->su_local, peer->su_remote, &peer->nexthop,
-                           peer)) {
-#if defined(HAVE_CUMULUS)
-               flog_err(
-                       BGP_ERR_NH_UPD,
-                       "%s: nexthop_set failed, resetting connection - intf %p",
-                       peer->host, peer->nexthop.ifp);
+       if (!bgp_zebra_nexthop_set(peer->su_local, peer->su_remote,
+                                  &peer->nexthop, peer)) {
+               flog_err(EC_BGP_NH_UPD,
+                        "%s: nexthop_set failed, resetting connection - intf %p",
+                        peer->host, peer->nexthop.ifp);
                return -1;
-#endif
        }
        return 0;
 }
@@ -657,14 +656,13 @@ static int bgp_listener(int sock, struct sockaddr *sa, socklen_t salen,
        }
 
        if (ret < 0) {
-               flog_err_sys(LIB_ERR_SOCKET, "bind: %s", safe_strerror(en));
+               flog_err_sys(EC_LIB_SOCKET, "bind: %s", safe_strerror(en));
                return ret;
        }
 
        ret = listen(sock, SOMAXCONN);
        if (ret < 0) {
-               flog_err_sys(LIB_ERR_SOCKET, "listen: %s",
-                            safe_strerror(errno));
+               flog_err_sys(EC_LIB_SOCKET, "listen: %s", safe_strerror(errno));
                return ret;
        }
 
@@ -672,7 +670,8 @@ static int bgp_listener(int sock, struct sockaddr *sa, socklen_t salen,
        listener->fd = sock;
 
        /* this socket needs a change of ns. record bgp back pointer */
-       if (bgp->vrf_id != VRF_DEFAULT && vrf_is_mapped_on_netns(bgp->vrf_id))
+       if (bgp->vrf_id != VRF_DEFAULT && vrf_is_mapped_on_netns(
+                                               vrf_lookup_by_id(bgp->vrf_id)))
                listener->bgp = bgp;
 
        memcpy(&listener->su, sa, salen);
@@ -705,11 +704,15 @@ int bgp_socket(struct bgp *bgp, unsigned short port, const char *address)
                                      bgp->vrf_id);
        }
        if (ret != 0) {
-               flog_err_sys(LIB_ERR_SOCKET, "getaddrinfo: %s",
+               flog_err_sys(EC_LIB_SOCKET, "getaddrinfo: %s",
                             gai_strerror(ret));
                return -1;
        }
-
+       if (bgp_option_check(BGP_OPT_NO_ZEBRA) &&
+           bgp->vrf_id != VRF_DEFAULT) {
+               freeaddrinfo(ainfo_save);
+               return -1;
+       }
        count = 0;
        for (ainfo = ainfo_save; ainfo; ainfo = ainfo->ai_next) {
                int sock;
@@ -726,7 +729,7 @@ int bgp_socket(struct bgp *bgp, unsigned short port, const char *address)
                                           ? bgp->name : NULL));
                }
                if (sock < 0) {
-                       flog_err_sys(LIB_ERR_SOCKET, "socket: %s",
+                       flog_err_sys(EC_LIB_SOCKET, "socket: %s",
                                     safe_strerror(errno));
                        continue;
                }
@@ -745,10 +748,10 @@ int bgp_socket(struct bgp *bgp, unsigned short port, const char *address)
        freeaddrinfo(ainfo_save);
        if (count == 0 && bgp->inst_type != BGP_INSTANCE_TYPE_VRF) {
                flog_err(
-                       LIB_ERR_SOCKET,
+                       EC_LIB_SOCKET,
                        "%s: no usable addresses please check other programs usage of specified port %d",
                        __func__, port);
-               flog_err_sys(LIB_ERR_SOCKET, "%s: Program cannot continue",
+               flog_err_sys(EC_LIB_SOCKET, "%s: Program cannot continue",
                             __func__);
                exit(-1);
        }