43
43
#include <net/udp.h>
44
44
#include <net/tcp.h>
45
45
#include <net/tcp_states.h>
46
- #include <net/tls.h>
47
46
#include <net/tls_prot.h>
48
47
#include <net/handshake.h>
49
48
#include <linux/uaccess.h>
@@ -227,27 +226,30 @@ static int svc_one_sock_name(struct svc_sock *svsk, char *buf, int remaining)
227
226
}
228
227
229
228
static int
230
- svc_tcp_sock_process_cmsg (struct svc_sock * svsk , struct msghdr * msg ,
229
+ svc_tcp_sock_process_cmsg (struct socket * sock , struct msghdr * msg ,
231
230
struct cmsghdr * cmsg , int ret )
232
231
{
233
- if (cmsg -> cmsg_level == SOL_TLS &&
234
- cmsg -> cmsg_type == TLS_GET_RECORD_TYPE ) {
235
- u8 content_type = * ((u8 * )CMSG_DATA (cmsg ));
236
-
237
- switch (content_type ) {
238
- case TLS_RECORD_TYPE_DATA :
239
- /* TLS sets EOR at the end of each application data
240
- * record, even though there might be more frames
241
- * waiting to be decrypted.
242
- */
243
- msg -> msg_flags &= ~MSG_EOR ;
244
- break ;
245
- case TLS_RECORD_TYPE_ALERT :
246
- ret = - ENOTCONN ;
247
- break ;
248
- default :
249
- ret = - EAGAIN ;
250
- }
232
+ u8 content_type = tls_get_record_type (sock -> sk , cmsg );
233
+ u8 level , description ;
234
+
235
+ switch (content_type ) {
236
+ case 0 :
237
+ break ;
238
+ case TLS_RECORD_TYPE_DATA :
239
+ /* TLS sets EOR at the end of each application data
240
+ * record, even though there might be more frames
241
+ * waiting to be decrypted.
242
+ */
243
+ msg -> msg_flags &= ~MSG_EOR ;
244
+ break ;
245
+ case TLS_RECORD_TYPE_ALERT :
246
+ tls_alert_recv (sock -> sk , msg , & level , & description );
247
+ ret = (level == TLS_ALERT_LEVEL_FATAL ) ?
248
+ - ENOTCONN : - EAGAIN ;
249
+ break ;
250
+ default :
251
+ /* discard this record type */
252
+ ret = - EAGAIN ;
251
253
}
252
254
return ret ;
253
255
}
@@ -259,13 +261,14 @@ svc_tcp_sock_recv_cmsg(struct svc_sock *svsk, struct msghdr *msg)
259
261
struct cmsghdr cmsg ;
260
262
u8 buf [CMSG_SPACE (sizeof (u8 ))];
261
263
} u ;
264
+ struct socket * sock = svsk -> sk_sock ;
262
265
int ret ;
263
266
264
267
msg -> msg_control = & u ;
265
268
msg -> msg_controllen = sizeof (u );
266
- ret = sock_recvmsg (svsk -> sk_sock , msg , MSG_DONTWAIT );
269
+ ret = sock_recvmsg (sock , msg , MSG_DONTWAIT );
267
270
if (unlikely (msg -> msg_controllen != sizeof (u )))
268
- ret = svc_tcp_sock_process_cmsg (svsk , msg , & u .cmsg , ret );
271
+ ret = svc_tcp_sock_process_cmsg (sock , msg , & u .cmsg , ret );
269
272
return ret ;
270
273
}
271
274
0 commit comments