@@ -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+
126185FIXTURE (tls_basic )
127186{
128187 int fd , cfd ;
@@ -1160,60 +1219,30 @@ TEST_F(tls, mutliproc_sendpage_writers)
11601219
11611220TEST_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