^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _GNU_SOURCE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <arpa/inet.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <error.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <fcntl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <poll.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <stdio.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <stdlib.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <unistd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/tls.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/tcp.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/socket.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <sys/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <sys/sendfile.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <sys/socket.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <sys/stat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include "../kselftest_harness.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define TLS_PAYLOAD_MAX_LEN 16384
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define SOL_TLS 282
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) FIXTURE(tls_basic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) int fd, cfd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) bool notls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) FIXTURE_SETUP(tls_basic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct sockaddr_in addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) socklen_t len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) int sfd, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) self->notls = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) len = sizeof(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) addr.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) addr.sin_addr.s_addr = htonl(INADDR_ANY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) addr.sin_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) self->fd = socket(AF_INET, SOCK_STREAM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) sfd = socket(AF_INET, SOCK_STREAM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) ret = bind(sfd, &addr, sizeof(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) ret = listen(sfd, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) ret = getsockname(sfd, &addr, &len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ret = connect(self->fd, &addr, sizeof(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) self->cfd = accept(sfd, &addr, &len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) ASSERT_GE(self->cfd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) close(sfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) ret = setsockopt(self->fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) ASSERT_EQ(errno, ENOENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) self->notls = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) printf("Failure setting TCP_ULP, testing without tls\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) ret = setsockopt(self->cfd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) FIXTURE_TEARDOWN(tls_basic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) close(self->fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) close(self->cfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) /* Send some data through with ULP but no keys */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) TEST_F(tls_basic, base_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) char const *test_str = "test_read";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) int send_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) char buf[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) ASSERT_EQ(strlen(test_str) + 1, send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) FIXTURE(tls)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) int fd, cfd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) bool notls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) FIXTURE_VARIANT(tls)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) unsigned int tls_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) FIXTURE_VARIANT_ADD(tls, 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) .tls_version = TLS_1_2_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) FIXTURE_VARIANT_ADD(tls, 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) .tls_version = TLS_1_3_VERSION,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) FIXTURE_SETUP(tls)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct tls12_crypto_info_aes_gcm_128 tls12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) struct sockaddr_in addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) socklen_t len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) int sfd, ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) self->notls = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) len = sizeof(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) memset(&tls12, 0, sizeof(tls12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) tls12.info.version = variant->tls_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) tls12.info.cipher_type = TLS_CIPHER_AES_GCM_128;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) addr.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) addr.sin_addr.s_addr = htonl(INADDR_ANY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) addr.sin_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) self->fd = socket(AF_INET, SOCK_STREAM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) sfd = socket(AF_INET, SOCK_STREAM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) ret = bind(sfd, &addr, sizeof(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) ret = listen(sfd, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) ret = getsockname(sfd, &addr, &len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ret = connect(self->fd, &addr, sizeof(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) ret = setsockopt(self->fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) self->notls = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) printf("Failure setting TCP_ULP, testing without tls\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) if (!self->notls) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) ret = setsockopt(self->fd, SOL_TLS, TLS_TX, &tls12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) sizeof(tls12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) self->cfd = accept(sfd, &addr, &len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) ASSERT_GE(self->cfd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) if (!self->notls) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) ret = setsockopt(self->cfd, IPPROTO_TCP, TCP_ULP, "tls",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) sizeof("tls"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) ret = setsockopt(self->cfd, SOL_TLS, TLS_RX, &tls12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) sizeof(tls12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) close(sfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) FIXTURE_TEARDOWN(tls)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) close(self->fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) close(self->cfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) TEST_F(tls, sendfile)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) int filefd = open("/proc/self/exe", O_RDONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct stat st;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) EXPECT_GE(filefd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) fstat(filefd, &st);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) EXPECT_GE(sendfile(self->fd, filefd, 0, st.st_size), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) TEST_F(tls, send_then_sendfile)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) int filefd = open("/proc/self/exe", O_RDONLY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) char const *test_str = "test_send";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) int to_send = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) char recv_buf[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) struct stat st;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) EXPECT_GE(filefd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) fstat(filefd, &st);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) buf = (char *)malloc(st.st_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) EXPECT_EQ(send(self->fd, test_str, to_send, 0), to_send);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) EXPECT_EQ(recv(self->cfd, recv_buf, to_send, MSG_WAITALL), to_send);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) EXPECT_EQ(memcmp(test_str, recv_buf, to_send), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) EXPECT_GE(sendfile(self->fd, filefd, 0, st.st_size), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) EXPECT_EQ(recv(self->cfd, buf, st.st_size, MSG_WAITALL), st.st_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) static void chunked_sendfile(struct __test_metadata *_metadata,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) struct _test_data_tls *self,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) uint16_t chunk_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) uint16_t extra_payload_size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) char buf[TLS_PAYLOAD_MAX_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) uint16_t test_payload_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) int size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) char filename[] = "/tmp/mytemp.XXXXXX";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) int fd = mkstemp(filename);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) off_t offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) unlink(filename);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) ASSERT_GE(fd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) EXPECT_GE(chunk_size, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) test_payload_size = chunk_size + extra_payload_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) ASSERT_GE(TLS_PAYLOAD_MAX_LEN, test_payload_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) memset(buf, 1, test_payload_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) size = write(fd, buf, test_payload_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) EXPECT_EQ(size, test_payload_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) fsync(fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) while (size > 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) ret = sendfile(self->fd, fd, &offset, chunk_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) EXPECT_GE(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) size -= ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) EXPECT_EQ(recv(self->cfd, buf, test_payload_size, MSG_WAITALL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) test_payload_size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) close(fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) TEST_F(tls, multi_chunk_sendfile)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) chunked_sendfile(_metadata, self, 4096, 4096);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) chunked_sendfile(_metadata, self, 4096, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) chunked_sendfile(_metadata, self, 4096, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) chunked_sendfile(_metadata, self, 4096, 2048);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) chunked_sendfile(_metadata, self, 8192, 2048);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) chunked_sendfile(_metadata, self, 4096, 8192);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) chunked_sendfile(_metadata, self, 8192, 4096);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) chunked_sendfile(_metadata, self, 12288, 1024);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) chunked_sendfile(_metadata, self, 12288, 2000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) chunked_sendfile(_metadata, self, 15360, 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) chunked_sendfile(_metadata, self, 15360, 300);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) chunked_sendfile(_metadata, self, 1, 4096);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) chunked_sendfile(_metadata, self, 2048, 4096);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) chunked_sendfile(_metadata, self, 2048, 8192);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) chunked_sendfile(_metadata, self, 4096, 8192);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) chunked_sendfile(_metadata, self, 1024, 12288);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) chunked_sendfile(_metadata, self, 2000, 12288);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) chunked_sendfile(_metadata, self, 100, 15360);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) chunked_sendfile(_metadata, self, 300, 15360);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) TEST_F(tls, recv_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) unsigned int send_len = TLS_PAYLOAD_MAX_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) char recv_mem[TLS_PAYLOAD_MAX_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) char buf[TLS_PAYLOAD_MAX_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) EXPECT_GE(send(self->fd, buf, send_len, 0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) EXPECT_NE(recv(self->cfd, recv_mem, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) EXPECT_EQ(memcmp(buf, recv_mem, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) TEST_F(tls, recv_small)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) char const *test_str = "test_read";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) int send_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) char buf[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) send_len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) TEST_F(tls, msg_more)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) char const *test_str = "test_read";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) int send_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) char buf[10 * 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) EXPECT_EQ(send(self->fd, test_str, send_len, MSG_MORE), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) EXPECT_EQ(recv(self->cfd, buf, send_len, MSG_DONTWAIT), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) EXPECT_EQ(recv(self->cfd, buf, send_len * 2, MSG_WAITALL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) send_len * 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) TEST_F(tls, msg_more_unsent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) char const *test_str = "test_read";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) int send_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) char buf[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) EXPECT_EQ(send(self->fd, test_str, send_len, MSG_MORE), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) EXPECT_EQ(recv(self->cfd, buf, send_len, MSG_DONTWAIT), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) TEST_F(tls, sendmsg_single)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) struct msghdr msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) char const *test_str = "test_sendmsg";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) size_t send_len = 13;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) struct iovec vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) char buf[13];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) vec.iov_base = (char *)test_str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) vec.iov_len = send_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) memset(&msg, 0, sizeof(struct msghdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) msg.msg_iov = &vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) msg.msg_iovlen = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) EXPECT_EQ(sendmsg(self->fd, &msg, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) EXPECT_EQ(recv(self->cfd, buf, send_len, MSG_WAITALL), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #define MAX_FRAGS 64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) #define SEND_LEN 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) TEST_F(tls, sendmsg_fragmented)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) char const *test_str = "test_sendmsg";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) char buf[SEND_LEN * MAX_FRAGS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) struct iovec vec[MAX_FRAGS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) struct msghdr msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) int i, frags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) for (frags = 1; frags <= MAX_FRAGS; frags++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) for (i = 0; i < frags; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) vec[i].iov_base = (char *)test_str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) vec[i].iov_len = SEND_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) memset(&msg, 0, sizeof(struct msghdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) msg.msg_iov = vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) msg.msg_iovlen = frags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) EXPECT_EQ(sendmsg(self->fd, &msg, 0), SEND_LEN * frags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) EXPECT_EQ(recv(self->cfd, buf, SEND_LEN * frags, MSG_WAITALL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) SEND_LEN * frags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) for (i = 0; i < frags; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) EXPECT_EQ(memcmp(buf + SEND_LEN * i,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) test_str, SEND_LEN), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) #undef MAX_FRAGS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) #undef SEND_LEN
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) TEST_F(tls, sendmsg_large)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) void *mem = malloc(16384);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) size_t send_len = 16384;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) size_t sends = 128;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) struct msghdr msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) size_t recvs = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) size_t sent = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) memset(&msg, 0, sizeof(struct msghdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) while (sent++ < sends) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) struct iovec vec = { (void *)mem, send_len };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) msg.msg_iov = &vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) msg.msg_iovlen = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) EXPECT_EQ(sendmsg(self->cfd, &msg, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) while (recvs++ < sends)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) EXPECT_NE(recv(self->fd, mem, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) free(mem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) TEST_F(tls, sendmsg_multiple)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) char const *test_str = "test_sendmsg_multiple";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) struct iovec vec[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) char *test_strs[5];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) struct msghdr msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) int total_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) int len_cmp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) int iov_len = 5;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) memset(&msg, 0, sizeof(struct msghdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) for (i = 0; i < iov_len; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) test_strs[i] = (char *)malloc(strlen(test_str) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) snprintf(test_strs[i], strlen(test_str) + 1, "%s", test_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) vec[i].iov_base = (void *)test_strs[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) vec[i].iov_len = strlen(test_strs[i]) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) total_len += vec[i].iov_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) msg.msg_iov = vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) msg.msg_iovlen = iov_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) EXPECT_EQ(sendmsg(self->cfd, &msg, 0), total_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) buf = malloc(total_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) EXPECT_NE(recv(self->fd, buf, total_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) for (i = 0; i < iov_len; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) EXPECT_EQ(memcmp(test_strs[i], buf + len_cmp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) strlen(test_strs[i])),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) len_cmp += strlen(buf + len_cmp) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) for (i = 0; i < iov_len; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) free(test_strs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) free(buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) TEST_F(tls, sendmsg_multiple_stress)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) char const *test_str = "abcdefghijklmno";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) struct iovec vec[1024];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) char *test_strs[1024];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) int iov_len = 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) int total_len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) char buf[1 << 14];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) struct msghdr msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) int len_cmp = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) memset(&msg, 0, sizeof(struct msghdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) for (i = 0; i < iov_len; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) test_strs[i] = (char *)malloc(strlen(test_str) + 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) snprintf(test_strs[i], strlen(test_str) + 1, "%s", test_str);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) vec[i].iov_base = (void *)test_strs[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) vec[i].iov_len = strlen(test_strs[i]) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) total_len += vec[i].iov_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) msg.msg_iov = vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) msg.msg_iovlen = iov_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) EXPECT_EQ(sendmsg(self->fd, &msg, 0), total_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) EXPECT_NE(recv(self->cfd, buf, total_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) for (i = 0; i < iov_len; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) len_cmp += strlen(buf + len_cmp) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) for (i = 0; i < iov_len; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) free(test_strs[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) TEST_F(tls, splice_from_pipe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) int send_len = TLS_PAYLOAD_MAX_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) char mem_send[TLS_PAYLOAD_MAX_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) char mem_recv[TLS_PAYLOAD_MAX_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) int p[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) ASSERT_GE(pipe(p), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) EXPECT_GE(write(p[1], mem_send, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) EXPECT_GE(splice(p[0], NULL, self->fd, NULL, send_len, 0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) EXPECT_EQ(recv(self->cfd, mem_recv, send_len, MSG_WAITALL), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) TEST_F(tls, splice_from_pipe2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) int send_len = 16000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) char mem_send[16000];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) char mem_recv[16000];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) int p2[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) int p[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) ASSERT_GE(pipe(p), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) ASSERT_GE(pipe(p2), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) EXPECT_GE(write(p[1], mem_send, 8000), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) EXPECT_GE(splice(p[0], NULL, self->fd, NULL, 8000, 0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) EXPECT_GE(write(p2[1], mem_send + 8000, 8000), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) EXPECT_GE(splice(p2[0], NULL, self->fd, NULL, 8000, 0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) EXPECT_EQ(recv(self->cfd, mem_recv, send_len, MSG_WAITALL), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) TEST_F(tls, send_and_splice)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) int send_len = TLS_PAYLOAD_MAX_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) char mem_send[TLS_PAYLOAD_MAX_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) char mem_recv[TLS_PAYLOAD_MAX_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) char const *test_str = "test_read";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) int send_len2 = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) char buf[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) int p[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) ASSERT_GE(pipe(p), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) EXPECT_EQ(send(self->fd, test_str, send_len2, 0), send_len2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) EXPECT_EQ(recv(self->cfd, buf, send_len2, MSG_WAITALL), send_len2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) EXPECT_EQ(memcmp(test_str, buf, send_len2), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) EXPECT_GE(write(p[1], mem_send, send_len), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) EXPECT_GE(splice(p[0], NULL, self->fd, NULL, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) EXPECT_EQ(recv(self->cfd, mem_recv, send_len, MSG_WAITALL), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) TEST_F(tls, splice_to_pipe)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) int send_len = TLS_PAYLOAD_MAX_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) char mem_send[TLS_PAYLOAD_MAX_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) char mem_recv[TLS_PAYLOAD_MAX_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) int p[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) ASSERT_GE(pipe(p), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) EXPECT_GE(send(self->fd, mem_send, send_len, 0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) EXPECT_GE(splice(self->cfd, NULL, p[1], NULL, send_len, 0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) EXPECT_GE(read(p[0], mem_recv, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) EXPECT_EQ(memcmp(mem_send, mem_recv, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) TEST_F(tls, recvmsg_single)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) char const *test_str = "test_recvmsg_single";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) int send_len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) char buf[20];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) struct msghdr hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) struct iovec vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) memset(&hdr, 0, sizeof(hdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) vec.iov_base = (char *)buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) vec.iov_len = send_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) hdr.msg_iovlen = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) hdr.msg_iov = &vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) EXPECT_NE(recvmsg(self->cfd, &hdr, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) TEST_F(tls, recvmsg_single_max)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) int send_len = TLS_PAYLOAD_MAX_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) char send_mem[TLS_PAYLOAD_MAX_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) char recv_mem[TLS_PAYLOAD_MAX_LEN];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) struct iovec vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) struct msghdr hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) EXPECT_EQ(send(self->fd, send_mem, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) vec.iov_base = (char *)recv_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) vec.iov_len = TLS_PAYLOAD_MAX_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) hdr.msg_iovlen = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) hdr.msg_iov = &vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) EXPECT_NE(recvmsg(self->cfd, &hdr, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) EXPECT_EQ(memcmp(send_mem, recv_mem, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) TEST_F(tls, recvmsg_multiple)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) unsigned int msg_iovlen = 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) unsigned int len_compared = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) struct iovec vec[1024];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) char *iov_base[1024];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) unsigned int iov_len = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) int send_len = 1 << 14;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) char buf[1 << 14];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) struct msghdr hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) EXPECT_EQ(send(self->fd, buf, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) for (i = 0; i < msg_iovlen; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) iov_base[i] = (char *)malloc(iov_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) vec[i].iov_base = iov_base[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) vec[i].iov_len = iov_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) hdr.msg_iovlen = msg_iovlen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) hdr.msg_iov = vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) EXPECT_NE(recvmsg(self->cfd, &hdr, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) for (i = 0; i < msg_iovlen; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) len_compared += iov_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) for (i = 0; i < msg_iovlen; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) free(iov_base[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) TEST_F(tls, single_send_multiple_recv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) unsigned int total_len = TLS_PAYLOAD_MAX_LEN * 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) unsigned int send_len = TLS_PAYLOAD_MAX_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) char send_mem[TLS_PAYLOAD_MAX_LEN * 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) char recv_mem[TLS_PAYLOAD_MAX_LEN * 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) EXPECT_GE(send(self->fd, send_mem, total_len, 0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) memset(recv_mem, 0, total_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) EXPECT_NE(recv(self->cfd, recv_mem, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) EXPECT_NE(recv(self->cfd, recv_mem + send_len, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) EXPECT_EQ(memcmp(send_mem, recv_mem, total_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) TEST_F(tls, multiple_send_single_recv)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) unsigned int total_len = 2 * 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) unsigned int send_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) char recv_mem[2 * 10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) char send_mem[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) EXPECT_GE(send(self->fd, send_mem, send_len, 0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) EXPECT_GE(send(self->fd, send_mem, send_len, 0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) memset(recv_mem, 0, total_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) EXPECT_EQ(recv(self->cfd, recv_mem, total_len, MSG_WAITALL), total_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) EXPECT_EQ(memcmp(send_mem, recv_mem, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) EXPECT_EQ(memcmp(send_mem, recv_mem + send_len, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) TEST_F(tls, single_send_multiple_recv_non_align)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) const unsigned int total_len = 15;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) const unsigned int recv_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) char recv_mem[recv_len * 2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) char send_mem[total_len];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) EXPECT_GE(send(self->fd, send_mem, total_len, 0), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) memset(recv_mem, 0, total_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) EXPECT_EQ(recv(self->cfd, recv_mem, recv_len, 0), recv_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) EXPECT_EQ(recv(self->cfd, recv_mem + recv_len, recv_len, 0), 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) EXPECT_EQ(memcmp(send_mem, recv_mem, total_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) TEST_F(tls, recv_partial)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) char const *test_str = "test_read_partial";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) char const *test_str_first = "test_read";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) char const *test_str_second = "_partial";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) int send_len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) char recv_mem[18];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) memset(recv_mem, 0, sizeof(recv_mem));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) EXPECT_NE(recv(self->cfd, recv_mem, strlen(test_str_first),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) MSG_WAITALL), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) EXPECT_EQ(memcmp(test_str_first, recv_mem, strlen(test_str_first)), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) memset(recv_mem, 0, sizeof(recv_mem));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) EXPECT_NE(recv(self->cfd, recv_mem, strlen(test_str_second),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) MSG_WAITALL), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) EXPECT_EQ(memcmp(test_str_second, recv_mem, strlen(test_str_second)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) TEST_F(tls, recv_nonblock)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) char buf[4096];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) bool err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) EXPECT_EQ(recv(self->cfd, buf, sizeof(buf), MSG_DONTWAIT), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) err = (errno == EAGAIN || errno == EWOULDBLOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) EXPECT_EQ(err, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) TEST_F(tls, recv_peek)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) char const *test_str = "test_read_peek";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) int send_len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) char buf[15];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) EXPECT_NE(recv(self->cfd, buf, send_len, MSG_PEEK), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) memset(buf, 0, sizeof(buf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) TEST_F(tls, recv_peek_multiple)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) char const *test_str = "test_read_peek";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) int send_len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) unsigned int num_peeks = 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) char buf[15];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) for (i = 0; i < num_peeks; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) EXPECT_NE(recv(self->cfd, buf, send_len, MSG_PEEK), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) memset(buf, 0, sizeof(buf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) EXPECT_EQ(memcmp(test_str, buf, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) TEST_F(tls, recv_peek_multiple_records)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) char const *test_str = "test_read_peek_mult_recs";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) char const *test_str_first = "test_read_peek";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) char const *test_str_second = "_mult_recs";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) char buf[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) len = strlen(test_str_first);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) EXPECT_EQ(send(self->fd, test_str_first, len, 0), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) len = strlen(test_str_second) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) EXPECT_EQ(send(self->fd, test_str_second, len, 0), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) len = strlen(test_str_first);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) memset(buf, 0, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) EXPECT_EQ(recv(self->cfd, buf, len, MSG_PEEK | MSG_WAITALL), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) /* MSG_PEEK can only peek into the current record. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) len = strlen(test_str_first);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) EXPECT_EQ(memcmp(test_str_first, buf, len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) memset(buf, 0, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) EXPECT_EQ(recv(self->cfd, buf, len, MSG_WAITALL), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) /* Non-MSG_PEEK will advance strparser (and therefore record)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) * however.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) EXPECT_EQ(memcmp(test_str, buf, len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) /* MSG_MORE will hold current record open, so later MSG_PEEK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) * will see everything.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) len = strlen(test_str_first);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) EXPECT_EQ(send(self->fd, test_str_first, len, MSG_MORE), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) len = strlen(test_str_second) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) EXPECT_EQ(send(self->fd, test_str_second, len, 0), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) memset(buf, 0, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) EXPECT_EQ(recv(self->cfd, buf, len, MSG_PEEK | MSG_WAITALL), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) EXPECT_EQ(memcmp(test_str, buf, len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) TEST_F(tls, recv_peek_large_buf_mult_recs)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) char const *test_str = "test_read_peek_mult_recs";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) char const *test_str_first = "test_read_peek";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) char const *test_str_second = "_mult_recs";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) int len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) char buf[64];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) len = strlen(test_str_first);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) EXPECT_EQ(send(self->fd, test_str_first, len, 0), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) len = strlen(test_str_second) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) EXPECT_EQ(send(self->fd, test_str_second, len, 0), len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) memset(buf, 0, len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) EXPECT_NE((len = recv(self->cfd, buf, len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) MSG_PEEK | MSG_WAITALL)), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) EXPECT_EQ(memcmp(test_str, buf, len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) TEST_F(tls, recv_lowat)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) char send_mem[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) char recv_mem[20];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) int lowat = 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) EXPECT_EQ(send(self->fd, send_mem, 10, 0), 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) EXPECT_EQ(send(self->fd, send_mem, 5, 0), 5);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) memset(recv_mem, 0, 20);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) EXPECT_EQ(setsockopt(self->cfd, SOL_SOCKET, SO_RCVLOWAT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) &lowat, sizeof(lowat)), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) EXPECT_EQ(recv(self->cfd, recv_mem, 1, MSG_WAITALL), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) EXPECT_EQ(recv(self->cfd, recv_mem + 1, 6, MSG_WAITALL), 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) EXPECT_EQ(recv(self->cfd, recv_mem + 7, 10, 0), 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) EXPECT_EQ(memcmp(send_mem, recv_mem, 10), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) EXPECT_EQ(memcmp(send_mem, recv_mem + 10, 5), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) TEST_F(tls, bidir)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) char const *test_str = "test_read";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) int send_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) char buf[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) if (!self->notls) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) struct tls12_crypto_info_aes_gcm_128 tls12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) memset(&tls12, 0, sizeof(tls12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) tls12.info.version = variant->tls_version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) tls12.info.cipher_type = TLS_CIPHER_AES_GCM_128;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) ret = setsockopt(self->fd, SOL_TLS, TLS_RX, &tls12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) sizeof(tls12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) ret = setsockopt(self->cfd, SOL_TLS, TLS_TX, &tls12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) sizeof(tls12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) ASSERT_EQ(strlen(test_str) + 1, send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) memset(buf, 0, sizeof(buf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) EXPECT_EQ(send(self->cfd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) EXPECT_NE(recv(self->fd, buf, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) TEST_F(tls, pollin)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) char const *test_str = "test_poll";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) struct pollfd fd = { 0, 0, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) char buf[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) int send_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) fd.fd = self->cfd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) fd.events = POLLIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) EXPECT_EQ(poll(&fd, 1, 20), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) EXPECT_EQ(fd.revents & POLLIN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) EXPECT_EQ(recv(self->cfd, buf, send_len, MSG_WAITALL), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) /* Test timing out */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) EXPECT_EQ(poll(&fd, 1, 20), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) TEST_F(tls, poll_wait)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) char const *test_str = "test_poll_wait";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) int send_len = strlen(test_str) + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) struct pollfd fd = { 0, 0, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) char recv_mem[15];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) fd.fd = self->cfd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) fd.events = POLLIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) /* Set timeout to inf. secs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) EXPECT_EQ(poll(&fd, 1, -1), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) EXPECT_EQ(fd.revents & POLLIN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) EXPECT_EQ(recv(self->cfd, recv_mem, send_len, MSG_WAITALL), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) TEST_F(tls, poll_wait_split)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) struct pollfd fd = { 0, 0, 0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) char send_mem[20] = {};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) char recv_mem[15];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) fd.fd = self->cfd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) fd.events = POLLIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) /* Send 20 bytes */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) EXPECT_EQ(send(self->fd, send_mem, sizeof(send_mem), 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) sizeof(send_mem));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) /* Poll with inf. timeout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) EXPECT_EQ(poll(&fd, 1, -1), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) EXPECT_EQ(fd.revents & POLLIN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), MSG_WAITALL),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) sizeof(recv_mem));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) /* Now the remaining 5 bytes of record data are in TLS ULP */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) fd.fd = self->cfd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) fd.events = POLLIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) EXPECT_EQ(poll(&fd, 1, -1), 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) EXPECT_EQ(fd.revents & POLLIN, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) EXPECT_EQ(recv(self->cfd, recv_mem, sizeof(recv_mem), 0),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) sizeof(send_mem) - sizeof(recv_mem));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) TEST_F(tls, blocking)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) size_t data = 100000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) int res = fork();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) EXPECT_NE(res, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901) if (res) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) /* parent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) size_t left = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) char buf[16384];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) int pid2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) while (left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) int res = send(self->fd, buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) left > 16384 ? 16384 : left, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) EXPECT_GE(res, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) left -= res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916) pid2 = wait(&status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) EXPECT_EQ(status, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) EXPECT_EQ(res, pid2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) /* child */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) size_t left = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) char buf[16384];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) while (left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) int res = recv(self->cfd, buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926) left > 16384 ? 16384 : left, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) EXPECT_GE(res, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) left -= res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) TEST_F(tls, nonblocking)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) size_t data = 100000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) int sendbuf = 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) int flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) flags = fcntl(self->fd, F_GETFL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) fcntl(self->fd, F_SETFL, flags | O_NONBLOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943) fcntl(self->cfd, F_SETFL, flags | O_NONBLOCK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) /* Ensure nonblocking behavior by imposing a small send
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) * buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) EXPECT_EQ(setsockopt(self->fd, SOL_SOCKET, SO_SNDBUF,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) &sendbuf, sizeof(sendbuf)), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) res = fork();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) EXPECT_NE(res, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) if (res) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) /* parent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) bool eagain = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) size_t left = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958) char buf[16384];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) int pid2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) while (left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) int res = send(self->fd, buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) left > 16384 ? 16384 : left, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) if (res == -1 && errno == EAGAIN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967) eagain = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) usleep(10000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) EXPECT_GE(res, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) left -= res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) EXPECT_TRUE(eagain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) pid2 = wait(&status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) EXPECT_EQ(status, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) EXPECT_EQ(res, pid2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) /* child */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) bool eagain = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) size_t left = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) char buf[16384];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986) while (left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) int res = recv(self->cfd, buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) left > 16384 ? 16384 : left, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) if (res == -1 && errno == EAGAIN) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) eagain = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) usleep(10000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) continue;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) EXPECT_GE(res, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) left -= res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) EXPECT_TRUE(eagain);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) test_mutliproc(struct __test_metadata *_metadata, struct _test_data_tls *self,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) bool sendpg, unsigned int n_readers, unsigned int n_writers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006) const unsigned int n_children = n_readers + n_writers;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) const size_t data = 6 * 1000 * 1000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) const size_t file_sz = data / 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) size_t read_bias, write_bias;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) int i, fd, child_id;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) char buf[file_sz];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) pid_t pid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) /* Only allow multiples for simplicity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015) ASSERT_EQ(!(n_readers % n_writers) || !(n_writers % n_readers), true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) read_bias = n_writers / n_readers ?: 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) write_bias = n_readers / n_writers ?: 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) /* prep a file to send */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) fd = open("/tmp/", O_TMPFILE | O_RDWR, 0600);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021) ASSERT_GE(fd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) memset(buf, 0xac, file_sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) ASSERT_EQ(write(fd, buf, file_sz), file_sz);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) /* spawn children */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) for (child_id = 0; child_id < n_children; child_id++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) pid = fork();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) ASSERT_NE(pid, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) if (!pid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) /* parent waits for all children */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) if (pid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036) for (i = 0; i < n_children; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) int status;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039) wait(&status);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) EXPECT_EQ(status, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) /* Split threads for reading and writing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) if (child_id < n_readers) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) size_t left = data * read_bias;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) char rb[8001];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) while (left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) res = recv(self->cfd, rb,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) left > sizeof(rb) ? sizeof(rb) : left, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) EXPECT_GE(res, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) left -= res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061) size_t left = data * write_bias;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) while (left) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) int res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) ASSERT_EQ(lseek(fd, 0, SEEK_SET), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) if (sendpg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) res = sendfile(self->fd, fd, NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) left > file_sz ? file_sz : left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071) res = send(self->fd, buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) left > file_sz ? file_sz : left, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) EXPECT_GE(res, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) left -= res;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) TEST_F(tls, mutliproc_even)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) test_mutliproc(_metadata, self, false, 6, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) TEST_F(tls, mutliproc_readers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) test_mutliproc(_metadata, self, false, 4, 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) TEST_F(tls, mutliproc_writers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) test_mutliproc(_metadata, self, false, 10, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) TEST_F(tls, mutliproc_sendpage_even)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) test_mutliproc(_metadata, self, true, 6, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) TEST_F(tls, mutliproc_sendpage_readers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) test_mutliproc(_metadata, self, true, 4, 12);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) TEST_F(tls, mutliproc_sendpage_writers)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) test_mutliproc(_metadata, self, true, 10, 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) TEST_F(tls, control_msg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) if (self->notls)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) char cbuf[CMSG_SPACE(sizeof(char))];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) char const *test_str = "test_read";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) int cmsg_len = sizeof(char);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118) char record_type = 100;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119) struct cmsghdr *cmsg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) struct msghdr msg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) int send_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) struct iovec vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123) char buf[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) vec.iov_base = (char *)test_str;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) vec.iov_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) memset(&msg, 0, sizeof(struct msghdr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) msg.msg_iov = &vec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) msg.msg_iovlen = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) msg.msg_control = cbuf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) msg.msg_controllen = sizeof(cbuf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) cmsg = CMSG_FIRSTHDR(&msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) cmsg->cmsg_level = SOL_TLS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) /* test sending non-record types. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) cmsg->cmsg_type = TLS_SET_RECORD_TYPE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136) cmsg->cmsg_len = CMSG_LEN(cmsg_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) *CMSG_DATA(cmsg) = record_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) msg.msg_controllen = cmsg->cmsg_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140) EXPECT_EQ(sendmsg(self->fd, &msg, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) /* Should fail because we didn't provide a control message */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) EXPECT_EQ(recv(self->cfd, buf, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) vec.iov_base = buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) EXPECT_EQ(recvmsg(self->cfd, &msg, MSG_WAITALL | MSG_PEEK), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) cmsg = CMSG_FIRSTHDR(&msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) EXPECT_NE(cmsg, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) EXPECT_EQ(cmsg->cmsg_level, SOL_TLS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) EXPECT_EQ(cmsg->cmsg_type, TLS_GET_RECORD_TYPE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) record_type = *((unsigned char *)CMSG_DATA(cmsg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) EXPECT_EQ(record_type, 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155) /* Recv the message again without MSG_PEEK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) record_type = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) memset(buf, 0, sizeof(buf));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) EXPECT_EQ(recvmsg(self->cfd, &msg, MSG_WAITALL), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) cmsg = CMSG_FIRSTHDR(&msg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161) EXPECT_NE(cmsg, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) EXPECT_EQ(cmsg->cmsg_level, SOL_TLS);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) EXPECT_EQ(cmsg->cmsg_type, TLS_GET_RECORD_TYPE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) record_type = *((unsigned char *)CMSG_DATA(cmsg));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) EXPECT_EQ(record_type, 100);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) TEST_F(tls, shutdown)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) char const *test_str = "test_read";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172) int send_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) char buf[10];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) ASSERT_EQ(strlen(test_str) + 1, send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) EXPECT_EQ(send(self->fd, test_str, send_len, 0), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) EXPECT_NE(recv(self->cfd, buf, send_len, 0), -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) shutdown(self->fd, SHUT_RDWR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182) shutdown(self->cfd, SHUT_RDWR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) TEST_F(tls, shutdown_unsent)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) char const *test_str = "test_read";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) int send_len = 10;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) EXPECT_EQ(send(self->fd, test_str, send_len, MSG_MORE), send_len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) shutdown(self->fd, SHUT_RDWR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) shutdown(self->cfd, SHUT_RDWR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196) TEST_F(tls, shutdown_reuse)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) struct sockaddr_in addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) shutdown(self->fd, SHUT_RDWR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) shutdown(self->cfd, SHUT_RDWR);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203) close(self->cfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) addr.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) addr.sin_addr.s_addr = htonl(INADDR_ANY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) addr.sin_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) ret = bind(self->fd, &addr, sizeof(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) EXPECT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) ret = listen(self->fd, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) EXPECT_EQ(ret, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) EXPECT_EQ(errno, EINVAL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) ret = connect(self->fd, &addr, sizeof(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) EXPECT_EQ(ret, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) EXPECT_EQ(errno, EISCONN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) TEST(non_established) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) struct tls12_crypto_info_aes_gcm_256 tls12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) struct sockaddr_in addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) int sfd, ret, fd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) socklen_t len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) len = sizeof(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) memset(&tls12, 0, sizeof(tls12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) tls12.info.version = TLS_1_2_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) tls12.info.cipher_type = TLS_CIPHER_AES_GCM_256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) addr.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) addr.sin_addr.s_addr = htonl(INADDR_ANY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) addr.sin_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) fd = socket(AF_INET, SOCK_STREAM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) sfd = socket(AF_INET, SOCK_STREAM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) ret = bind(sfd, &addr, sizeof(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241) ret = listen(sfd, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) ret = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) EXPECT_EQ(ret, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) /* TLS ULP not supported */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) if (errno == ENOENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) EXPECT_EQ(errno, ENOTCONN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251) ret = setsockopt(sfd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) EXPECT_EQ(ret, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) EXPECT_EQ(errno, ENOTCONN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) ret = getsockname(sfd, &addr, &len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) ret = connect(fd, &addr, sizeof(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) ret = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264) ret = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) EXPECT_EQ(ret, -1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) EXPECT_EQ(errno, EEXIST);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) close(fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) close(sfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) TEST(keysizes) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) struct tls12_crypto_info_aes_gcm_256 tls12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) struct sockaddr_in addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275) int sfd, ret, fd, cfd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) socklen_t len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) bool notls;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) notls = false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) len = sizeof(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) memset(&tls12, 0, sizeof(tls12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) tls12.info.version = TLS_1_2_VERSION;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) tls12.info.cipher_type = TLS_CIPHER_AES_GCM_256;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) addr.sin_family = AF_INET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) addr.sin_addr.s_addr = htonl(INADDR_ANY);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) addr.sin_port = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) fd = socket(AF_INET, SOCK_STREAM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) sfd = socket(AF_INET, SOCK_STREAM, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) ret = bind(sfd, &addr, sizeof(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) ret = listen(sfd, 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) ret = getsockname(sfd, &addr, &len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) ret = connect(fd, &addr, sizeof(addr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) ASSERT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) ret = setsockopt(fd, IPPROTO_TCP, TCP_ULP, "tls", sizeof("tls"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305) if (ret != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) notls = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) printf("Failure setting TCP_ULP, testing without tls\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) if (!notls) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) ret = setsockopt(fd, SOL_TLS, TLS_TX, &tls12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) sizeof(tls12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) EXPECT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) cfd = accept(sfd, &addr, &len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) ASSERT_GE(cfd, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) if (!notls) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320) ret = setsockopt(cfd, IPPROTO_TCP, TCP_ULP, "tls",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) sizeof("tls"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) EXPECT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324) ret = setsockopt(cfd, SOL_TLS, TLS_RX, &tls12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) sizeof(tls12));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) EXPECT_EQ(ret, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329) close(sfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330) close(fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) close(cfd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) TEST_HARNESS_MAIN