@@ -123,6 +123,65 @@ static void ulp_sock_pair(struct __test_metadata *_metadata,
123
123
ASSERT_EQ (ret , 0 );
124
124
}
125
125
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
+
126
185
FIXTURE (tls_basic )
127
186
{
128
187
int fd , cfd ;
@@ -1160,60 +1219,30 @@ TEST_F(tls, mutliproc_sendpage_writers)
1160
1219
1161
1220
TEST_F (tls , control_msg )
1162
1221
{
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" ;
1169
1223
char record_type = 100 ;
1170
- struct cmsghdr * cmsg ;
1171
- struct msghdr msg ;
1172
1224
int send_len = 10 ;
1173
- struct iovec vec ;
1174
1225
char buf [10 ];
1175
1226
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" );
1190
1229
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 );
1192
1232
/* Should fail because we didn't provide a control message */
1193
1233
EXPECT_EQ (recv (self -> cfd , buf , send_len , 0 ), -1 );
1194
1234
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 );
1204
1238
EXPECT_EQ (memcmp (buf , test_str , send_len ), 0 );
1205
1239
1206
1240
/* Recv the message again without MSG_PEEK */
1207
- record_type = 0 ;
1208
1241
memset (buf , 0 , sizeof (buf ));
1209
1242
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 );
1217
1246
EXPECT_EQ (memcmp (buf , test_str , send_len ), 0 );
1218
1247
}
1219
1248
0 commit comments