diff options
author | Eugene Tarassov | 2019-11-09 18:21:07 +0000 |
---|---|---|
committer | Eugene Tarassov | 2019-11-09 18:21:07 +0000 |
commit | afa8f14c3af8127cff26007096cabccc9acd6c88 (patch) | |
tree | 0f66f90484e383d756ce967529cd1b0f2884acdb /agent/tcf | |
parent | eee4880d404303ff80a036a0f077a8b763c37e94 (diff) | |
download | org.eclipse.tcf.agent-afa8f14c3af8127cff26007096cabccc9acd6c88.tar.gz org.eclipse.tcf.agent-afa8f14c3af8127cff26007096cabccc9acd6c88.tar.xz org.eclipse.tcf.agent-afa8f14c3af8127cff26007096cabccc9acd6c88.zip |
Bug 552677 - increase socket buffer size for tcf on vxworks
Diffstat (limited to 'agent/tcf')
-rw-r--r-- | agent/tcf/framework/channel_tcp.c | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/agent/tcf/framework/channel_tcp.c b/agent/tcf/framework/channel_tcp.c index a5d0d0c3..cf4744d2 100644 --- a/agent/tcf/framework/channel_tcp.c +++ b/agent/tcf/framework/channel_tcp.c @@ -88,6 +88,13 @@ # endif #endif +#ifndef SOCKET_SEND_BUFFER_MINSIZE +# define SOCKET_SEND_BUFFER_MINSIZE 200 * 1024 +#endif +#ifndef SOCKET_RECV_BUFFER_MINSIZE +# define SOCKET_RECV_BUFFER_MINSIZE 120 * 1024 +#endif + typedef struct ChannelTCP ChannelTCP; struct ChannelTCP { @@ -884,6 +891,30 @@ static ChannelTCP * create_channel(int sock, int en_ssl, int server, int unix_do } } + { + /* Buffer sizes need to be large enough to avoid deadlocking when agent connects to itself */ + int snd_org = 0; + int rcv_org = 0; + socklen_t snd_len = sizeof(snd_org); + socklen_t rcv_len = sizeof(rcv_org); + int snd_buf = SOCKET_SEND_BUFFER_MINSIZE; + int rcv_buf = SOCKET_RECV_BUFFER_MINSIZE; + + if (getsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&snd_org, &snd_len) < 0) { + trace(LOG_ALWAYS, "getsockopt(SOL_SOCKET,SO_SNDBUF,...) error: %s", errno_to_str(errno)); + } + else if (snd_org < snd_buf && setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&snd_buf, sizeof(snd_buf)) < 0) { + trace(LOG_ALWAYS, "setsockopt(SOL_SOCKET,SO_SNDBUF,%d) error: %s", snd_buf, errno_to_str(errno)); + } + + if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rcv_org, &rcv_len) < 0) { + trace(LOG_ALWAYS, "getsockopt(SOL_SOCKET,SO_RCVBUF,...) error: %s", errno_to_str(errno)); + } + else if (rcv_org < rcv_buf && setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rcv_buf, sizeof(rcv_buf)) < 0) { + trace(LOG_ALWAYS, "setsockopt(SOL_SOCKET,SO_RCVBUF,%d) error: %s", rcv_buf, errno_to_str(errno)); + } + } + if (en_ssl) { #if ENABLE_SSL if (ssl_ctx == NULL) { @@ -1201,18 +1232,6 @@ static void server_close(ChannelServer * serv) { /* TODO: free server struct */ } -static void set_socket_buffer_sizes(int sock) { - /* Buffer sizes need to be large enough to avoid deadlocking when agent connects to itself */ - int snd_buf = 4 * BUF_SIZE; - int rcv_buf = 8 * BUF_SIZE; - if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (char *)&snd_buf, sizeof(snd_buf)) < 0) { - trace(LOG_ALWAYS, "setsockopt(SOL_SOCKET,SO_SNDBUF,%d) error: %s", snd_buf, errno_to_str(errno)); - } - if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char *)&rcv_buf, sizeof(rcv_buf)) < 0) { - trace(LOG_ALWAYS, "setsockopt(SOL_SOCKET,SO_RCVBUF,%d) error: %s", rcv_buf, errno_to_str(errno)); - } -} - static ChannelServer * channel_server_create(PeerServer * ps, int sock) { ServerTCP * si = (ServerTCP *)loc_alloc_zero(sizeof *si); /* TODO: need to investigate usage of sizeof(sockaddr_storage) for address buffer size */ @@ -1499,7 +1518,6 @@ void channel_tcp_connect(PeerServer * ps, ChannelConnectCallBack callback, void error = errno; } else { - set_socket_buffer_sizes(info->sock); error = 0; break; } @@ -1539,7 +1557,6 @@ void channel_unix_connect(PeerServer * ps, ChannelConnectCallBack callback, void info->addr_buf = (struct sockaddr *)loc_alloc(sizeof(struct sockaddr_un)); error = setup_unix_sockaddr(ps, (struct sockaddr_un *)info->addr_buf); if (!error && (info->sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0) error = errno; - if (!error) set_socket_buffer_sizes(info->sock); if (error) { if (info->sock >= 0) closesocket(info->sock); |