mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-04-28 19:10:16 +00:00
lib,vtysh: Use backoff setsockopt option for freebsd
Commit:9112fb367b
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 <sharpd@nvidia.com> (cherry picked from commit959dbe27cd
)
This commit is contained in:
parent
7aa65cfefc
commit
16bb1dd5b0
16
lib/vty.c
16
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;
|
||||
|
@ -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)
|
||||
|
@ -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");
|
||||
|
||||
@ -4694,9 +4695,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));
|
||||
|
Loading…
Reference in New Issue
Block a user