@@ -393,6 +393,7 @@ static uint16_t tcp_recvhandler(FAR struct net_driver_s *dev,
393
393
FAR void * pvpriv , uint16_t flags )
394
394
{
395
395
FAR struct tcp_recvfrom_s * pstate = pvpriv ;
396
+ FAR struct iob_s * iob = NULL ;
396
397
397
398
ninfo ("flags: %04x\n" , flags );
398
399
@@ -408,12 +409,37 @@ static uint16_t tcp_recvhandler(FAR struct net_driver_s *dev,
408
409
409
410
tcp_sender (dev , pstate );
410
411
412
+ if ((flags & TCP_ACKDATA ) != 0 )
413
+ {
414
+ iob = iob_tryalloc (false);
415
+ if (iob == NULL )
416
+ {
417
+ nerr ("ERROR: IOB alloc failed !\n" );
418
+ return flags ;
419
+ }
420
+
421
+ iob_reserve (iob , CONFIG_NET_LL_GUARDSIZE );
422
+ int ret = iob_clone_partial (dev -> d_iob , dev -> d_iob -> io_pktlen ,
423
+ 0 , iob , 0 , false, false);
424
+ if (ret < 0 )
425
+ {
426
+ iob_free_chain (iob );
427
+ nerr ("ERROR: IOB clone failed ret=%d!\n" , ret );
428
+ return flags ;
429
+ }
430
+ }
431
+
411
432
/* Copy the data from the packet (saving any unused bytes from the
412
433
* packet in the read-ahead buffer).
413
434
*/
414
435
415
436
flags = tcp_newdata (dev , pstate , flags );
416
437
438
+ if (iob != NULL )
439
+ {
440
+ netdev_iob_replace (dev , iob );
441
+ }
442
+
417
443
/* Indicate that the data has been consumed and that an ACK
418
444
* should be sent.
419
445
*/
0 commit comments