@@ -210,7 +210,7 @@ static void __sendpair(struct __test_metadata *_metadata,
210
210
static void __recvpair (struct __test_metadata * _metadata ,
211
211
FIXTURE_DATA (msg_oob ) * self ,
212
212
const char * expected_buf , int expected_len ,
213
- int buf_len , int flags )
213
+ int buf_len , int flags , bool is_sender )
214
214
{
215
215
int i , ret [2 ], recv_errno [2 ], expected_errno = 0 ;
216
216
char recv_buf [2 ][BUF_SZ ] = {};
@@ -221,7 +221,9 @@ static void __recvpair(struct __test_metadata *_metadata,
221
221
errno = 0 ;
222
222
223
223
for (i = 0 ; i < 2 ; i ++ ) {
224
- ret [i ] = recv (self -> fd [i * 2 + 1 ], recv_buf [i ], buf_len , flags );
224
+ int index = is_sender ? i * 2 : i * 2 + 1 ;
225
+
226
+ ret [i ] = recv (self -> fd [index ], recv_buf [i ], buf_len , flags );
225
227
recv_errno [i ] = errno ;
226
228
}
227
229
@@ -308,6 +310,20 @@ static void __siocatmarkpair(struct __test_metadata *_metadata,
308
310
ASSERT_EQ (answ [0 ], answ [1 ]);
309
311
}
310
312
313
+ static void __resetpair (struct __test_metadata * _metadata ,
314
+ FIXTURE_DATA (msg_oob ) * self ,
315
+ const FIXTURE_VARIANT (msg_oob ) * variant ,
316
+ bool reset )
317
+ {
318
+ int i ;
319
+
320
+ for (i = 0 ; i < 2 ; i ++ )
321
+ close (self -> fd [i * 2 + 1 ]);
322
+
323
+ __recvpair (_metadata , self , "" , reset ? - ECONNRESET : 0 , 1 ,
324
+ variant -> peek ? MSG_PEEK : 0 , true);
325
+ }
326
+
311
327
#define sendpair (buf , len , flags ) \
312
328
__sendpair(_metadata, self, buf, len, flags)
313
329
@@ -316,9 +332,10 @@ static void __siocatmarkpair(struct __test_metadata *_metadata,
316
332
if (variant->peek) \
317
333
__recvpair(_metadata, self, \
318
334
expected_buf, expected_len, \
319
- buf_len, (flags) | MSG_PEEK); \
335
+ buf_len, (flags) | MSG_PEEK, false ); \
320
336
__recvpair(_metadata, self, \
321
- expected_buf, expected_len, buf_len, flags); \
337
+ expected_buf, expected_len, \
338
+ buf_len, flags, false); \
322
339
} while (0)
323
340
324
341
#define epollpair (oob_remaining ) \
@@ -330,6 +347,9 @@ static void __siocatmarkpair(struct __test_metadata *_metadata,
330
347
#define setinlinepair () \
331
348
__setinlinepair(_metadata, self)
332
349
350
+ #define resetpair (reset ) \
351
+ __resetpair(_metadata, self, variant, reset)
352
+
333
353
#define tcp_incompliant \
334
354
for (self->tcp_compliant = false; \
335
355
self->tcp_compliant == false; \
@@ -344,6 +364,21 @@ TEST_F(msg_oob, non_oob)
344
364
recvpair ("" , - EINVAL , 1 , MSG_OOB );
345
365
epollpair (false);
346
366
siocatmarkpair (false);
367
+
368
+ resetpair (true);
369
+ }
370
+
371
+ TEST_F (msg_oob , non_oob_no_reset )
372
+ {
373
+ sendpair ("x" , 1 , 0 );
374
+ epollpair (false);
375
+ siocatmarkpair (false);
376
+
377
+ recvpair ("x" , 1 , 1 , 0 );
378
+ epollpair (false);
379
+ siocatmarkpair (false);
380
+
381
+ resetpair (false);
347
382
}
348
383
349
384
TEST_F (msg_oob , oob )
@@ -355,6 +390,19 @@ TEST_F(msg_oob, oob)
355
390
recvpair ("x" , 1 , 1 , MSG_OOB );
356
391
epollpair (false);
357
392
siocatmarkpair (true);
393
+
394
+ tcp_incompliant {
395
+ resetpair (false); /* TCP sets -ECONNRESET for ex-OOB. */
396
+ }
397
+ }
398
+
399
+ TEST_F (msg_oob , oob_reset )
400
+ {
401
+ sendpair ("x" , 1 , MSG_OOB );
402
+ epollpair (true);
403
+ siocatmarkpair (true);
404
+
405
+ resetpair (true);
358
406
}
359
407
360
408
TEST_F (msg_oob , oob_drop )
@@ -370,6 +418,8 @@ TEST_F(msg_oob, oob_drop)
370
418
recvpair ("" , - EINVAL , 1 , MSG_OOB );
371
419
epollpair (false);
372
420
siocatmarkpair (false);
421
+
422
+ resetpair (false);
373
423
}
374
424
375
425
TEST_F (msg_oob , oob_ahead )
@@ -385,6 +435,10 @@ TEST_F(msg_oob, oob_ahead)
385
435
recvpair ("hell" , 4 , 4 , 0 );
386
436
epollpair (false);
387
437
siocatmarkpair (true);
438
+
439
+ tcp_incompliant {
440
+ resetpair (false); /* TCP sets -ECONNRESET for ex-OOB. */
441
+ }
388
442
}
389
443
390
444
TEST_F (msg_oob , oob_break )
@@ -403,6 +457,8 @@ TEST_F(msg_oob, oob_break)
403
457
404
458
recvpair ("" , - EAGAIN , 1 , 0 );
405
459
siocatmarkpair (false);
460
+
461
+ resetpair (false);
406
462
}
407
463
408
464
TEST_F (msg_oob , oob_ahead_break )
@@ -426,6 +482,8 @@ TEST_F(msg_oob, oob_ahead_break)
426
482
recvpair ("world" , 5 , 5 , 0 );
427
483
epollpair (false);
428
484
siocatmarkpair (false);
485
+
486
+ resetpair (false);
429
487
}
430
488
431
489
TEST_F (msg_oob , oob_break_drop )
@@ -449,6 +507,8 @@ TEST_F(msg_oob, oob_break_drop)
449
507
recvpair ("" , - EINVAL , 1 , MSG_OOB );
450
508
epollpair (false);
451
509
siocatmarkpair (false);
510
+
511
+ resetpair (false);
452
512
}
453
513
454
514
TEST_F (msg_oob , ex_oob_break )
@@ -476,6 +536,8 @@ TEST_F(msg_oob, ex_oob_break)
476
536
recvpair ("ld" , 2 , 2 , 0 );
477
537
epollpair (false);
478
538
siocatmarkpair (false);
539
+
540
+ resetpair (false);
479
541
}
480
542
481
543
TEST_F (msg_oob , ex_oob_drop )
@@ -498,6 +560,8 @@ TEST_F(msg_oob, ex_oob_drop)
498
560
epollpair (false);
499
561
siocatmarkpair (true);
500
562
}
563
+
564
+ resetpair (false);
501
565
}
502
566
503
567
TEST_F (msg_oob , ex_oob_drop_2 )
@@ -523,6 +587,8 @@ TEST_F(msg_oob, ex_oob_drop_2)
523
587
epollpair (false);
524
588
siocatmarkpair (true);
525
589
}
590
+
591
+ resetpair (false);
526
592
}
527
593
528
594
TEST_F (msg_oob , ex_oob_oob )
@@ -546,6 +612,54 @@ TEST_F(msg_oob, ex_oob_oob)
546
612
recvpair ("" , - EINVAL , 1 , MSG_OOB );
547
613
epollpair (false);
548
614
siocatmarkpair (false);
615
+
616
+ resetpair (false);
617
+ }
618
+
619
+ TEST_F (msg_oob , ex_oob_ex_oob )
620
+ {
621
+ sendpair ("x" , 1 , MSG_OOB );
622
+ epollpair (true);
623
+ siocatmarkpair (true);
624
+
625
+ recvpair ("x" , 1 , 1 , MSG_OOB );
626
+ epollpair (false);
627
+ siocatmarkpair (true);
628
+
629
+ sendpair ("y" , 1 , MSG_OOB );
630
+ epollpair (true);
631
+ siocatmarkpair (true);
632
+
633
+ recvpair ("y" , 1 , 1 , MSG_OOB );
634
+ epollpair (false);
635
+ siocatmarkpair (true);
636
+
637
+ tcp_incompliant {
638
+ resetpair (false); /* TCP sets -ECONNRESET for ex-OOB. */
639
+ }
640
+ }
641
+
642
+ TEST_F (msg_oob , ex_oob_ex_oob_oob )
643
+ {
644
+ sendpair ("x" , 1 , MSG_OOB );
645
+ epollpair (true);
646
+ siocatmarkpair (true);
647
+
648
+ recvpair ("x" , 1 , 1 , MSG_OOB );
649
+ epollpair (false);
650
+ siocatmarkpair (true);
651
+
652
+ sendpair ("y" , 1 , MSG_OOB );
653
+ epollpair (true);
654
+ siocatmarkpair (true);
655
+
656
+ recvpair ("y" , 1 , 1 , MSG_OOB );
657
+ epollpair (false);
658
+ siocatmarkpair (true);
659
+
660
+ sendpair ("z" , 1 , MSG_OOB );
661
+ epollpair (true);
662
+ siocatmarkpair (true);
549
663
}
550
664
551
665
TEST_F (msg_oob , ex_oob_ahead_break )
@@ -576,6 +690,10 @@ TEST_F(msg_oob, ex_oob_ahead_break)
576
690
recvpair ("d" , 1 , 1 , MSG_OOB );
577
691
epollpair (false);
578
692
siocatmarkpair (true);
693
+
694
+ tcp_incompliant {
695
+ resetpair (false); /* TCP sets -ECONNRESET for ex-OOB. */
696
+ }
579
697
}
580
698
581
699
TEST_F (msg_oob , ex_oob_siocatmark )
@@ -595,6 +713,8 @@ TEST_F(msg_oob, ex_oob_siocatmark)
595
713
recvpair ("hell" , 4 , 4 , 0 ); /* Intentionally stop at ex-OOB. */
596
714
epollpair (true);
597
715
siocatmarkpair (false);
716
+
717
+ resetpair (true);
598
718
}
599
719
600
720
TEST_F (msg_oob , inline_oob )
@@ -612,6 +732,8 @@ TEST_F(msg_oob, inline_oob)
612
732
recvpair ("x" , 1 , 1 , 0 );
613
733
epollpair (false);
614
734
siocatmarkpair (false);
735
+
736
+ resetpair (false);
615
737
}
616
738
617
739
TEST_F (msg_oob , inline_oob_break )
@@ -633,6 +755,8 @@ TEST_F(msg_oob, inline_oob_break)
633
755
recvpair ("o" , 1 , 1 , 0 );
634
756
epollpair (false);
635
757
siocatmarkpair (false);
758
+
759
+ resetpair (false);
636
760
}
637
761
638
762
TEST_F (msg_oob , inline_oob_ahead_break )
@@ -661,6 +785,8 @@ TEST_F(msg_oob, inline_oob_ahead_break)
661
785
662
786
epollpair (false);
663
787
siocatmarkpair (false);
788
+
789
+ resetpair (false);
664
790
}
665
791
666
792
TEST_F (msg_oob , inline_ex_oob_break )
@@ -686,6 +812,8 @@ TEST_F(msg_oob, inline_ex_oob_break)
686
812
recvpair ("rld" , 3 , 3 , 0 );
687
813
epollpair (false);
688
814
siocatmarkpair (false);
815
+
816
+ resetpair (false);
689
817
}
690
818
691
819
TEST_F (msg_oob , inline_ex_oob_no_drop )
@@ -707,6 +835,8 @@ TEST_F(msg_oob, inline_ex_oob_no_drop)
707
835
recvpair ("y" , 1 , 1 , 0 );
708
836
epollpair (false);
709
837
siocatmarkpair (false);
838
+
839
+ resetpair (false);
710
840
}
711
841
712
842
TEST_F (msg_oob , inline_ex_oob_drop )
@@ -731,6 +861,8 @@ TEST_F(msg_oob, inline_ex_oob_drop)
731
861
epollpair (false);
732
862
siocatmarkpair (false);
733
863
}
864
+
865
+ resetpair (false);
734
866
}
735
867
736
868
TEST_F (msg_oob , inline_ex_oob_siocatmark )
@@ -752,6 +884,8 @@ TEST_F(msg_oob, inline_ex_oob_siocatmark)
752
884
recvpair ("hell" , 4 , 4 , 0 ); /* Intentionally stop at ex-OOB. */
753
885
epollpair (true);
754
886
siocatmarkpair (false);
887
+
888
+ resetpair (true);
755
889
}
756
890
757
891
TEST_HARNESS_MAIN
0 commit comments