Skip to content

Commit 31180ad

Browse files
committed
selftests: tls: factor out cmsg send/receive
Add helpers for sending and receiving special record types. Signed-off-by: Jakub Kicinski <[email protected]>
1 parent a125f91 commit 31180ad

File tree

1 file changed

+70
-41
lines changed
  • tools/testing/selftests/net

1 file changed

+70
-41
lines changed

tools/testing/selftests/net/tls.c

Lines changed: 70 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,65 @@ static void ulp_sock_pair(struct __test_metadata *_metadata,
123123
ASSERT_EQ(ret, 0);
124124
}
125125

126+
/* Produce a basic cmsg */
127+
static int tls_send_cmsg(int fd, unsigned char record_type,
128+
void *data, size_t len, int flags)
129+
{
130+
char cbuf[CMSG_SPACE(sizeof(char))];
131+
int cmsg_len = sizeof(char);
132+
struct cmsghdr *cmsg;
133+
struct msghdr msg;
134+
struct iovec vec;
135+
136+
vec.iov_base = data;
137+
vec.iov_len = len;
138+
memset(&msg, 0, sizeof(struct msghdr));
139+
msg.msg_iov = &vec;
140+
msg.msg_iovlen = 1;
141+
msg.msg_control = cbuf;
142+
msg.msg_controllen = sizeof(cbuf);
143+
cmsg = CMSG_FIRSTHDR(&msg);
144+
cmsg->cmsg_level = SOL_TLS;
145+
/* test sending non-record types. */
146+
cmsg->cmsg_type = TLS_SET_RECORD_TYPE;
147+
cmsg->cmsg_len = CMSG_LEN(cmsg_len);
148+
*CMSG_DATA(cmsg) = record_type;
149+
msg.msg_controllen = cmsg->cmsg_len;
150+
151+
return sendmsg(fd, &msg, flags);
152+
}
153+
154+
static int tls_recv_cmsg(struct __test_metadata *_metadata,
155+
int fd, unsigned char record_type,
156+
void *data, size_t len, int flags)
157+
{
158+
char cbuf[CMSG_SPACE(sizeof(char))];
159+
struct cmsghdr *cmsg;
160+
unsigned char ctype;
161+
struct msghdr msg;
162+
struct iovec vec;
163+
int n;
164+
165+
vec.iov_base = data;
166+
vec.iov_len = len;
167+
memset(&msg, 0, sizeof(struct msghdr));
168+
msg.msg_iov = &vec;
169+
msg.msg_iovlen = 1;
170+
msg.msg_control = cbuf;
171+
msg.msg_controllen = sizeof(cbuf);
172+
173+
n = recvmsg(fd, &msg, flags);
174+
175+
cmsg = CMSG_FIRSTHDR(&msg);
176+
EXPECT_NE(cmsg, NULL);
177+
EXPECT_EQ(cmsg->cmsg_level, SOL_TLS);
178+
EXPECT_EQ(cmsg->cmsg_type, TLS_GET_RECORD_TYPE);
179+
ctype = *((unsigned char *)CMSG_DATA(cmsg));
180+
EXPECT_EQ(ctype, record_type);
181+
182+
return n;
183+
}
184+
126185
FIXTURE(tls_basic)
127186
{
128187
int fd, cfd;
@@ -1160,60 +1219,30 @@ TEST_F(tls, mutliproc_sendpage_writers)
11601219

11611220
TEST_F(tls, control_msg)
11621221
{
1163-
if (self->notls)
1164-
return;
1165-
1166-
char cbuf[CMSG_SPACE(sizeof(char))];
1167-
char const *test_str = "test_read";
1168-
int cmsg_len = sizeof(char);
1222+
char *test_str = "test_read";
11691223
char record_type = 100;
1170-
struct cmsghdr *cmsg;
1171-
struct msghdr msg;
11721224
int send_len = 10;
1173-
struct iovec vec;
11741225
char buf[10];
11751226

1176-
vec.iov_base = (char *)test_str;
1177-
vec.iov_len = 10;
1178-
memset(&msg, 0, sizeof(struct msghdr));
1179-
msg.msg_iov = &vec;
1180-
msg.msg_iovlen = 1;
1181-
msg.msg_control = cbuf;
1182-
msg.msg_controllen = sizeof(cbuf);
1183-
cmsg = CMSG_FIRSTHDR(&msg);
1184-
cmsg->cmsg_level = SOL_TLS;
1185-
/* test sending non-record types. */
1186-
cmsg->cmsg_type = TLS_SET_RECORD_TYPE;
1187-
cmsg->cmsg_len = CMSG_LEN(cmsg_len);
1188-
*CMSG_DATA(cmsg) = record_type;
1189-
msg.msg_controllen = cmsg->cmsg_len;
1227+
if (self->notls)
1228+
SKIP(return, "no TLS support");
11901229

1191-
EXPECT_EQ(sendmsg(self->fd, &msg, 0), send_len);
1230+
EXPECT_EQ(tls_send_cmsg(self->fd, record_type, test_str, send_len, 0),
1231+
send_len);
11921232
/* Should fail because we didn't provide a control message */
11931233
EXPECT_EQ(recv(self->cfd, buf, send_len, 0), -1);
11941234

1195-
vec.iov_base = buf;
1196-
EXPECT_EQ(recvmsg(self->cfd, &msg, MSG_WAITALL | MSG_PEEK), send_len);
1197-
1198-
cmsg = CMSG_FIRSTHDR(&msg);
1199-
EXPECT_NE(cmsg, NULL);
1200-
EXPECT_EQ(cmsg->cmsg_level, SOL_TLS);
1201-
EXPECT_EQ(cmsg->cmsg_type, TLS_GET_RECORD_TYPE);
1202-
record_type = *((unsigned char *)CMSG_DATA(cmsg));
1203-
EXPECT_EQ(record_type, 100);
1235+
EXPECT_EQ(tls_recv_cmsg(_metadata, self->cfd, record_type,
1236+
buf, sizeof(buf), MSG_WAITALL | MSG_PEEK),
1237+
send_len);
12041238
EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
12051239

12061240
/* Recv the message again without MSG_PEEK */
1207-
record_type = 0;
12081241
memset(buf, 0, sizeof(buf));
12091242

1210-
EXPECT_EQ(recvmsg(self->cfd, &msg, MSG_WAITALL), send_len);
1211-
cmsg = CMSG_FIRSTHDR(&msg);
1212-
EXPECT_NE(cmsg, NULL);
1213-
EXPECT_EQ(cmsg->cmsg_level, SOL_TLS);
1214-
EXPECT_EQ(cmsg->cmsg_type, TLS_GET_RECORD_TYPE);
1215-
record_type = *((unsigned char *)CMSG_DATA(cmsg));
1216-
EXPECT_EQ(record_type, 100);
1243+
EXPECT_EQ(tls_recv_cmsg(_metadata, self->cfd, record_type,
1244+
buf, sizeof(buf), MSG_WAITALL),
1245+
send_len);
12171246
EXPECT_EQ(memcmp(buf, test_str, send_len), 0);
12181247
}
12191248

0 commit comments

Comments
 (0)