Skip to content

Commit

Permalink
lib,vtysh: Use backoff setsockopt option for freebsd
Browse files Browse the repository at this point in the history
Commit: 9112fb3

Introduced the idea of setting the socket buffer
send/receive sizes.  BSD's in general have the fun
issue of not allowing nearly as large as a size as
linux.  Since the above commit was developed on linux
and not run on bsd it was never tested.  Modify the
codebase to use the backoff setsockopt that we have
in the code base and use the returned values to allow
us to notice what was set and respond appropriately.

Signed-off-by: Donald Sharp <[email protected]>
  • Loading branch information
donaldsharp committed Dec 3, 2024
1 parent d5615fd commit 959dbe2
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 7 deletions.
16 changes: 12 additions & 4 deletions lib/vty.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
#include "northbound_cli.h"
#include "printfrr.h"
#include "json.h"
#include "sockopt.h"

#include <arpa/telnet.h>
#include <termios.h>
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -2157,22 +2158,29 @@ 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
printf("VTY shell accept\n");
#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;
Expand Down
3 changes: 3 additions & 0 deletions lib/vty.h
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
6 changes: 3 additions & 3 deletions vtysh/vtysh.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
#include "frrstr.h"
#include "json.h"
#include "ferr.h"
#include "sockopt.h"

DEFINE_MTYPE_STATIC(MVTYSH, VTYSH_CMD, "Vtysh cmd copy");

Expand Down Expand Up @@ -4690,9 +4691,8 @@ static int vtysh_connect(struct vtysh_client *vclient)
* Increasing the RECEIVE socket buffer size so that the socket can hold
* after receving from other process.
*/
ret = setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rcvbufsize,
sizeof(rcvbufsize));
if (ret < 0) {
ret = setsockopt_so_recvbuf(sock, rcvbufsize);
if (ret <= 0) {
#ifdef DEBUG
fprintf(stderr, "Cannot set socket %d rcv buffer size, %s\n",
sock, safe_strerror(errno));
Expand Down

0 comments on commit 959dbe2

Please sign in to comment.