| From 4e4c8c7a1cca2125e2bf2a67cbab0bdbd78fdb86 Mon Sep 17 00:00:00 2001 |
| From: He Zhe <zhe.he@windriver.com> |
| Date: Tue, 30 Jul 2019 13:24:22 +0800 |
| Subject: [PATCH] ptts: Set recv buffer size too max to receive as many |
| packets as possible |
| |
| Flooding multicast may make the rcv buffer overrun and is considered |
| premature messages later and thus cause the following error. |
| |
| "Ignoring premature msg 16, currently handling 12" |
| |
| This patch sets SO_RCVBUF the of socket to max int value to receive as many |
| packets as possible, and give a hint to user when possible overrun occurs. Note |
| that the value of SO_RCVBUF will be limited up to min(INT_MAX/2, |
| sysctl_rmem_max) in kernel. |
| |
| Signed-off-by: He Zhe <zhe.he@windriver.com> |
| |
| Upstream-Status: Backport |
| |
| Signed-off-by: Li Zhou <li.zhou@windriver.com> |
| --- |
| ptts/tipc_ts_server.c | 18 ++++++++++++++++-- |
| 1 file changed, 16 insertions(+), 2 deletions(-) |
| |
| diff --git a/ptts/tipc_ts_server.c b/ptts/tipc_ts_server.c |
| index a286daa..3a2f96f 100644 |
| --- a/ptts/tipc_ts_server.c |
| +++ b/ptts/tipc_ts_server.c |
| @@ -641,8 +641,9 @@ void server_mcast |
| if (rc < 0) |
| err("multicast message not received"); |
| if (msgno != *(int*) buf) { |
| - dbg1("Ignoring premature msg %u, currently handling %u\n", |
| - *(int*)buf, msgno); |
| + dbg1("Ignoring premature msg %u, currently handling %u\n" |
| + "You can enlarge /proc/sys/net/core/rmem_max and try again\n", |
| + *(int*)buf, msgno); |
| continue; |
| } |
| rc = recvfrom(sd[i], buf, expected_szs[numSubTest], |
| @@ -687,8 +688,21 @@ void server_test_multicast(void) |
| FD_ZERO(&readfds); |
| |
| for (i = 0; i < TIPC_MCAST_SOCKETS; i++) { |
| + int optval = (int)(~0U >> 1); |
| + socklen_t optlen = sizeof(optval); |
| + int rc = 0; |
| + |
| sd[i] = createSocketTIPC (SOCK_RDM); |
| FD_SET(sd[i], &readfds); |
| + |
| + /* |
| + * Flooding multicast may make the rcv buffer overrun and considered premature msg later. |
| + * Set SO_RCVBUF to max int value to receive as many packets as possible. |
| + * Note that it will be limited up to min(INT_MAX/2, sysctl_rmem_max) in kernel. |
| + */ |
| + rc = setsockopt(sd[i], SOL_SOCKET, SO_RCVBUF, (const char*)&optval, optlen); |
| + if(rc != 0) |
| + printf("Failed to set SO_RCVBUF of %d: %s\n", sd[i], strerror(errno)); |
| } |
| |
| server_bindMulticast( 0, 99, sd[0]); |
| -- |
| 2.17.1 |
| |