1From 4e4c8c7a1cca2125e2bf2a67cbab0bdbd78fdb86 Mon Sep 17 00:00:00 2001 2From: He Zhe <zhe.he@windriver.com> 3Date: Tue, 30 Jul 2019 13:24:22 +0800 4Subject: [PATCH] ptts: Set recv buffer size too max to receive as many 5 packets as possible 6 7Flooding multicast may make the rcv buffer overrun and is considered 8premature messages later and thus cause the following error. 9 10"Ignoring premature msg 16, currently handling 12" 11 12This patch sets SO_RCVBUF the of socket to max int value to receive as many 13packets as possible, and give a hint to user when possible overrun occurs. Note 14that the value of SO_RCVBUF will be limited up to min(INT_MAX/2, 15sysctl_rmem_max) in kernel. 16 17Signed-off-by: He Zhe <zhe.he@windriver.com> 18 19Upstream-Status: Backport 20 21Signed-off-by: Li Zhou <li.zhou@windriver.com> 22--- 23 ptts/tipc_ts_server.c | 18 ++++++++++++++++-- 24 1 file changed, 16 insertions(+), 2 deletions(-) 25 26diff --git a/ptts/tipc_ts_server.c b/ptts/tipc_ts_server.c 27index a286daa..3a2f96f 100644 28--- a/ptts/tipc_ts_server.c 29+++ b/ptts/tipc_ts_server.c 30@@ -641,8 +641,9 @@ void server_mcast 31 if (rc < 0) 32 err("multicast message not received"); 33 if (msgno != *(int*) buf) { 34- dbg1("Ignoring premature msg %u, currently handling %u\n", 35- *(int*)buf, msgno); 36+ dbg1("Ignoring premature msg %u, currently handling %u\n" 37+ "You can enlarge /proc/sys/net/core/rmem_max and try again\n", 38+ *(int*)buf, msgno); 39 continue; 40 } 41 rc = recvfrom(sd[i], buf, expected_szs[numSubTest], 42@@ -687,8 +688,21 @@ void server_test_multicast(void) 43 FD_ZERO(&readfds); 44 45 for (i = 0; i < TIPC_MCAST_SOCKETS; i++) { 46+ int optval = (int)(~0U >> 1); 47+ socklen_t optlen = sizeof(optval); 48+ int rc = 0; 49+ 50 sd[i] = createSocketTIPC (SOCK_RDM); 51 FD_SET(sd[i], &readfds); 52+ 53+ /* 54+ * Flooding multicast may make the rcv buffer overrun and considered premature msg later. 55+ * Set SO_RCVBUF to max int value to receive as many packets as possible. 56+ * Note that it will be limited up to min(INT_MAX/2, sysctl_rmem_max) in kernel. 57+ */ 58+ rc = setsockopt(sd[i], SOL_SOCKET, SO_RCVBUF, (const char*)&optval, optlen); 59+ if(rc != 0) 60+ printf("Failed to set SO_RCVBUF of %d: %s\n", sd[i], strerror(errno)); 61 } 62 63 server_bindMulticast( 0, 99, sd[0]); 64-- 652.17.1 66 67