Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests/tls: add a test for fragmented messages

Add a sendmsg test with very fragmented messages. This should
fill up sk_msg and test the boundary conditions.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jakub Kicinski and committed by
David S. Miller
65190f77 031097d9

+60
+60
tools/testing/selftests/net/tls.c
··· 268 268 EXPECT_EQ(memcmp(buf, test_str, send_len), 0); 269 269 } 270 270 271 + #define MAX_FRAGS 64 272 + #define SEND_LEN 13 273 + TEST_F(tls, sendmsg_fragmented) 274 + { 275 + char const *test_str = "test_sendmsg"; 276 + char buf[SEND_LEN * MAX_FRAGS]; 277 + struct iovec vec[MAX_FRAGS]; 278 + struct msghdr msg; 279 + int i, frags; 280 + 281 + for (frags = 1; frags <= MAX_FRAGS; frags++) { 282 + for (i = 0; i < frags; i++) { 283 + vec[i].iov_base = (char *)test_str; 284 + vec[i].iov_len = SEND_LEN; 285 + } 286 + 287 + memset(&msg, 0, sizeof(struct msghdr)); 288 + msg.msg_iov = vec; 289 + msg.msg_iovlen = frags; 290 + 291 + EXPECT_EQ(sendmsg(self->fd, &msg, 0), SEND_LEN * frags); 292 + EXPECT_EQ(recv(self->cfd, buf, SEND_LEN * frags, MSG_WAITALL), 293 + SEND_LEN * frags); 294 + 295 + for (i = 0; i < frags; i++) 296 + EXPECT_EQ(memcmp(buf + SEND_LEN * i, 297 + test_str, SEND_LEN), 0); 298 + } 299 + } 300 + #undef MAX_FRAGS 301 + #undef SEND_LEN 302 + 271 303 TEST_F(tls, sendmsg_large) 272 304 { 273 305 void *mem = malloc(16384); ··· 724 692 725 693 EXPECT_EQ(memcmp(send_mem, recv_mem, 10), 0); 726 694 EXPECT_EQ(memcmp(send_mem, recv_mem + 10, 5), 0); 695 + } 696 + 697 + TEST_F(tls, recv_rcvbuf) 698 + { 699 + char send_mem[4096]; 700 + char recv_mem[4096]; 701 + int rcv_buf = 1024; 702 + 703 + memset(send_mem, 0x1c, sizeof(send_mem)); 704 + 705 + EXPECT_EQ(setsockopt(self->cfd, SOL_SOCKET, SO_RCVBUF, 706 + &rcv_buf, sizeof(rcv_buf)), 0); 707 + 708 + EXPECT_EQ(send(self->fd, send_mem, 512, 0), 512); 709 + memset(recv_mem, 0, sizeof(recv_mem)); 710 + EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), 512); 711 + EXPECT_EQ(memcmp(send_mem, recv_mem, 512), 0); 712 + 713 + if (self->notls) 714 + return; 715 + 716 + EXPECT_EQ(send(self->fd, send_mem, 4096, 0), 4096); 717 + memset(recv_mem, 0, sizeof(recv_mem)); 718 + EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), -1); 719 + EXPECT_EQ(errno, EMSGSIZE); 720 + 721 + EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0), -1); 722 + EXPECT_EQ(errno, EMSGSIZE); 727 723 } 728 724 729 725 TEST_F(tls, bidir)