diff options
author | Donatas Abraitis <donatas@opensourcerouting.org> | 2024-12-04 13:46:08 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-12-04 13:46:08 +0100 |
commit | 75e9b1b090ab0cb2059a8143dc3edf7bbbc41927 (patch) | |
tree | 6d930df7d119f49d58817411037ab9833b7cb143 /lib | |
parent | Merge pull request #17558 from donaldsharp/bfd_fix (diff) | |
parent | lib,vtysh: Use backoff setsockopt option for freebsd (diff) | |
download | frr-75e9b1b090ab0cb2059a8143dc3edf7bbbc41927.tar.xz frr-75e9b1b090ab0cb2059a8143dc3edf7bbbc41927.zip |
Merge pull request #17571 from donaldsharp/fix_bsd_sockopt_problem
Fix bsd sockopt problem
Diffstat (limited to 'lib')
-rw-r--r-- | lib/sockopt.c | 8 | ||||
-rw-r--r-- | lib/sockopt.h | 4 | ||||
-rw-r--r-- | lib/vty.c | 16 | ||||
-rw-r--r-- | lib/vty.h | 3 |
4 files changed, 23 insertions, 8 deletions
diff --git a/lib/sockopt.c b/lib/sockopt.c index 74bc034cc..003ddb72d 100644 --- a/lib/sockopt.c +++ b/lib/sockopt.c @@ -19,7 +19,7 @@ #define HAVE_BSD_STRUCT_IP_MREQ_HACK #endif -void setsockopt_so_recvbuf(int sock, int size) +int setsockopt_so_recvbuf(int sock, int size) { int orig_req = size; @@ -34,9 +34,11 @@ void setsockopt_so_recvbuf(int sock, int size) flog_err(EC_LIB_SOCKET, "%s: fd %d: SO_RCVBUF set to %d (requested %d)", __func__, sock, size, orig_req); + + return size; } -void setsockopt_so_sendbuf(const int sock, int size) +int setsockopt_so_sendbuf(const int sock, int size) { int orig_req = size; @@ -51,6 +53,8 @@ void setsockopt_so_sendbuf(const int sock, int size) flog_err(EC_LIB_SOCKET, "%s: fd %d: SO_SNDBUF set to %d (requested %d)", __func__, sock, size, orig_req); + + return size; } int getsockopt_so_sendbuf(const int sock) diff --git a/lib/sockopt.h b/lib/sockopt.h index e6fb78d5e..cbf988cbe 100644 --- a/lib/sockopt.h +++ b/lib/sockopt.h @@ -12,8 +12,8 @@ extern "C" { #endif -extern void setsockopt_so_recvbuf(int sock, int size); -extern void setsockopt_so_sendbuf(const int sock, int size); +extern int setsockopt_so_recvbuf(int sock, int size); +extern int setsockopt_so_sendbuf(const int sock, int size); extern int getsockopt_so_sendbuf(const int sock); extern int getsockopt_so_recvbuf(const int sock); @@ -43,6 +43,7 @@ #include "northbound_cli.h" #include "printfrr.h" #include "json.h" +#include "sockopt.h" #include <arpa/telnet.h> #include <termios.h> @@ -352,7 +353,7 @@ int vty_out(struct vty *vty, const char *format, ...) * put the data of collective vty->obuf Linked List items on the * socket and free the vty->obuf data. */ - if (vty->vty_buf_size_accumulated >= VTY_MAX_INTERMEDIATE_FLUSH) { + if (vty->vty_buf_size_accumulated >= vty->buf_size_intermediate) { vty->vty_buf_size_accumulated = 0; vtysh_flush(vty); } @@ -2157,15 +2158,15 @@ static void vtysh_accept(struct event *thread) * Increasing the SEND socket buffer size so that the socket can hold * before sending it to VTY shell. */ - ret = setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&sndbufsize, - sizeof(sndbufsize)); - if (ret < 0) { + ret = setsockopt_so_sendbuf(sock, sndbufsize); + if (ret <= 0) { flog_err(EC_LIB_SOCKET, "Cannot set socket %d send buffer size, %s", sock, safe_strerror(errno)); close(sock); return; } + set_cloexec(sock); #ifdef VTYSH_DEBUG @@ -2173,6 +2174,13 @@ static void vtysh_accept(struct event *thread) #endif /* VTYSH_DEBUG */ vty = vty_new(); + + vty->buf_size_set = ret; + if (vty->buf_size_set < VTY_MAX_INTERMEDIATE_FLUSH) + vty->buf_size_intermediate = vty->buf_size_set / 2; + else + vty->buf_size_intermediate = VTY_MAX_INTERMEDIATE_FLUSH; + vty->fd = sock; vty->wfd = sock; vty->type = VTY_SHELL_SERV; @@ -237,6 +237,9 @@ struct vty { bool mgmt_locked_candidate_ds; bool mgmt_locked_running_ds; uint64_t vty_buf_size_accumulated; + + int buf_size_set; + uint64_t buf_size_intermediate; }; static inline void vty_push_context(struct vty *vty, int node, uint64_t id) |