@@ -109,8 +109,11 @@ static int espintcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
109
109
flags |= nonblock ? MSG_DONTWAIT : 0 ;
110
110
111
111
skb = __skb_recv_datagram (sk , & ctx -> ike_queue , flags , & off , & err );
112
- if (!skb )
112
+ if (!skb ) {
113
+ if (err == - EAGAIN && sk -> sk_shutdown & RCV_SHUTDOWN )
114
+ return 0 ;
113
115
return err ;
116
+ }
114
117
115
118
copied = len ;
116
119
if (copied > skb -> len )
@@ -213,7 +216,7 @@ static int espintcp_sendskmsg_locked(struct sock *sk,
213
216
return 0 ;
214
217
}
215
218
216
- static int espintcp_push_msgs (struct sock * sk )
219
+ static int espintcp_push_msgs (struct sock * sk , int flags )
217
220
{
218
221
struct espintcp_ctx * ctx = espintcp_getctx (sk );
219
222
struct espintcp_msg * emsg = & ctx -> partial ;
@@ -227,12 +230,12 @@ static int espintcp_push_msgs(struct sock *sk)
227
230
ctx -> tx_running = 1 ;
228
231
229
232
if (emsg -> skb )
230
- err = espintcp_sendskb_locked (sk , emsg , 0 );
233
+ err = espintcp_sendskb_locked (sk , emsg , flags );
231
234
else
232
- err = espintcp_sendskmsg_locked (sk , emsg , 0 );
235
+ err = espintcp_sendskmsg_locked (sk , emsg , flags );
233
236
if (err == - EAGAIN ) {
234
237
ctx -> tx_running = 0 ;
235
- return 0 ;
238
+ return flags & MSG_DONTWAIT ? - EAGAIN : 0 ;
236
239
}
237
240
if (!err )
238
241
memset (emsg , 0 , sizeof (* emsg ));
@@ -257,7 +260,7 @@ int espintcp_push_skb(struct sock *sk, struct sk_buff *skb)
257
260
offset = skb_transport_offset (skb );
258
261
len = skb -> len - offset ;
259
262
260
- espintcp_push_msgs (sk );
263
+ espintcp_push_msgs (sk , 0 );
261
264
262
265
if (emsg -> len ) {
263
266
kfree_skb (skb );
@@ -270,7 +273,7 @@ int espintcp_push_skb(struct sock *sk, struct sk_buff *skb)
270
273
emsg -> len = len ;
271
274
emsg -> skb = skb ;
272
275
273
- espintcp_push_msgs (sk );
276
+ espintcp_push_msgs (sk , 0 );
274
277
275
278
return 0 ;
276
279
}
@@ -287,7 +290,7 @@ static int espintcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
287
290
char buf [2 ] = {0 };
288
291
int err , end ;
289
292
290
- if (msg -> msg_flags )
293
+ if (msg -> msg_flags & ~ MSG_DONTWAIT )
291
294
return - EOPNOTSUPP ;
292
295
293
296
if (size > MAX_ESPINTCP_MSG )
@@ -298,9 +301,10 @@ static int espintcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
298
301
299
302
lock_sock (sk );
300
303
301
- err = espintcp_push_msgs (sk );
304
+ err = espintcp_push_msgs (sk , msg -> msg_flags & MSG_DONTWAIT );
302
305
if (err < 0 ) {
303
- err = - ENOBUFS ;
306
+ if (err != - EAGAIN || !(msg -> msg_flags & MSG_DONTWAIT ))
307
+ err = - ENOBUFS ;
304
308
goto unlock ;
305
309
}
306
310
@@ -337,10 +341,9 @@ static int espintcp_sendmsg(struct sock *sk, struct msghdr *msg, size_t size)
337
341
338
342
tcp_rate_check_app_limited (sk );
339
343
340
- err = espintcp_push_msgs (sk );
344
+ err = espintcp_push_msgs (sk , msg -> msg_flags & MSG_DONTWAIT );
341
345
/* this message could be partially sent, keep it */
342
- if (err < 0 )
343
- goto unlock ;
346
+
344
347
release_sock (sk );
345
348
346
349
return size ;
@@ -374,7 +377,7 @@ static void espintcp_tx_work(struct work_struct *work)
374
377
375
378
lock_sock (sk );
376
379
if (!ctx -> tx_running )
377
- espintcp_push_msgs (sk );
380
+ espintcp_push_msgs (sk , 0 );
378
381
release_sock (sk );
379
382
}
380
383
0 commit comments