summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorDonatas Abraitis <donatas@opensourcerouting.org>2024-12-04 13:46:08 +0100
committerGitHub <noreply@github.com>2024-12-04 13:46:08 +0100
commit75e9b1b090ab0cb2059a8143dc3edf7bbbc41927 (patch)
tree6d930df7d119f49d58817411037ab9833b7cb143 /lib
parentMerge pull request #17558 from donaldsharp/bfd_fix (diff)
parentlib,vtysh: Use backoff setsockopt option for freebsd (diff)
downloadfrr-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.c8
-rw-r--r--lib/sockopt.h4
-rw-r--r--lib/vty.c16
-rw-r--r--lib/vty.h3
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);
diff --git a/lib/vty.c b/lib/vty.c
index 256a3bb3f..1d04e75bf 100644
--- a/lib/vty.c
+++ b/lib/vty.c
@@ -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;
diff --git a/lib/vty.h b/lib/vty.h
index e511e8e79..be54159aa 100644
--- a/lib/vty.h
+++ b/lib/vty.h
@@ -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)