@@ -286,11 +286,11 @@ func Fuzz_handleGRO(f *testing.F) {
286
286
pkt9 := udp6Packet (ip6PortA , ip6PortB , 100 )
287
287
pkt10 := udp6Packet (ip6PortA , ip6PortB , 100 )
288
288
pkt11 := udp6Packet (ip6PortA , ip6PortC , 100 )
289
- f .Add (pkt0 , pkt1 , pkt2 , pkt3 , pkt4 , pkt5 , pkt6 , pkt7 , pkt8 , pkt9 , pkt10 , pkt11 , offset )
290
- f .Fuzz (func (t * testing.T , pkt0 , pkt1 , pkt2 , pkt3 , pkt4 , pkt5 , pkt6 , pkt7 , pkt8 , pkt9 , pkt10 , pkt11 []byte , offset int ) {
289
+ f .Add (pkt0 , pkt1 , pkt2 , pkt3 , pkt4 , pkt5 , pkt6 , pkt7 , pkt8 , pkt9 , pkt10 , pkt11 , true , offset )
290
+ f .Fuzz (func (t * testing.T , pkt0 , pkt1 , pkt2 , pkt3 , pkt4 , pkt5 , pkt6 , pkt7 , pkt8 , pkt9 , pkt10 , pkt11 []byte , canUDPGRO bool , offset int ) {
291
291
pkts := [][]byte {pkt0 , pkt1 , pkt2 , pkt3 , pkt4 , pkt5 , pkt6 , pkt7 , pkt8 , pkt9 , pkt10 , pkt11 }
292
292
toWrite := make ([]int , 0 , len (pkts ))
293
- handleGRO (pkts , offset , newTCPGROTable (), newUDPGROTable (), & toWrite )
293
+ handleGRO (pkts , offset , newTCPGROTable (), newUDPGROTable (), canUDPGRO , & toWrite )
294
294
if len (toWrite ) > len (pkts ) {
295
295
t .Errorf ("len(toWrite): %d > len(pkts): %d" , len (toWrite ), len (pkts ))
296
296
}
@@ -311,6 +311,7 @@ func Test_handleGRO(t *testing.T) {
311
311
tests := []struct {
312
312
name string
313
313
pktsIn [][]byte
314
+ canUDPGRO bool
314
315
wantToWrite []int
315
316
wantLens []int
316
317
wantErr bool
@@ -330,10 +331,31 @@ func Test_handleGRO(t *testing.T) {
330
331
udp6Packet (ip6PortA , ip6PortB , 100 ), // udp6 flow 1
331
332
udp6Packet (ip6PortA , ip6PortB , 100 ), // udp6 flow 1
332
333
},
334
+ true ,
333
335
[]int {0 , 1 , 2 , 4 , 5 , 7 , 9 },
334
336
[]int {240 , 228 , 128 , 140 , 260 , 160 , 248 },
335
337
false ,
336
338
},
339
+ {
340
+ "multiple protocols and flows no UDP GRO" ,
341
+ [][]byte {
342
+ tcp4Packet (ip4PortA , ip4PortB , header .TCPFlagAck , 100 , 1 ), // tcp4 flow 1
343
+ udp4Packet (ip4PortA , ip4PortB , 100 ), // udp4 flow 1
344
+ udp4Packet (ip4PortA , ip4PortC , 100 ), // udp4 flow 2
345
+ tcp4Packet (ip4PortA , ip4PortB , header .TCPFlagAck , 100 , 101 ), // tcp4 flow 1
346
+ tcp4Packet (ip4PortA , ip4PortC , header .TCPFlagAck , 100 , 201 ), // tcp4 flow 2
347
+ tcp6Packet (ip6PortA , ip6PortB , header .TCPFlagAck , 100 , 1 ), // tcp6 flow 1
348
+ tcp6Packet (ip6PortA , ip6PortB , header .TCPFlagAck , 100 , 101 ), // tcp6 flow 1
349
+ tcp6Packet (ip6PortA , ip6PortC , header .TCPFlagAck , 100 , 201 ), // tcp6 flow 2
350
+ udp4Packet (ip4PortA , ip4PortB , 100 ), // udp4 flow 1
351
+ udp6Packet (ip6PortA , ip6PortB , 100 ), // udp6 flow 1
352
+ udp6Packet (ip6PortA , ip6PortB , 100 ), // udp6 flow 1
353
+ },
354
+ false ,
355
+ []int {0 , 1 , 2 , 4 , 5 , 7 , 8 , 9 , 10 },
356
+ []int {240 , 128 , 128 , 140 , 260 , 160 , 128 , 148 , 148 },
357
+ false ,
358
+ },
337
359
{
338
360
"PSH interleaved" ,
339
361
[][]byte {
@@ -346,6 +368,7 @@ func Test_handleGRO(t *testing.T) {
346
368
tcp6Packet (ip6PortA , ip6PortB , header .TCPFlagAck , 100 , 201 ), // v6 flow 1
347
369
tcp6Packet (ip6PortA , ip6PortB , header .TCPFlagAck , 100 , 301 ), // v6 flow 1
348
370
},
371
+ true ,
349
372
[]int {0 , 2 , 4 , 6 },
350
373
[]int {240 , 240 , 260 , 260 },
351
374
false ,
@@ -360,6 +383,7 @@ func Test_handleGRO(t *testing.T) {
360
383
udp4Packet (ip4PortA , ip4PortB , 100 ),
361
384
udp4Packet (ip4PortA , ip4PortB , 100 ),
362
385
},
386
+ true ,
363
387
[]int {0 , 1 , 3 , 4 },
364
388
[]int {140 , 240 , 128 , 228 },
365
389
false ,
@@ -371,6 +395,7 @@ func Test_handleGRO(t *testing.T) {
371
395
tcp4Packet (ip4PortA , ip4PortB , header .TCPFlagAck , 100 , 1 ), // v4 flow 1 seq 1 len 100
372
396
tcp4Packet (ip4PortA , ip4PortB , header .TCPFlagAck , 100 , 201 ), // v4 flow 1 seq 201 len 100
373
397
},
398
+ true ,
374
399
[]int {0 },
375
400
[]int {340 },
376
401
false ,
@@ -387,6 +412,7 @@ func Test_handleGRO(t *testing.T) {
387
412
fields .TTL ++
388
413
}),
389
414
},
415
+ true ,
390
416
[]int {0 , 1 , 2 , 3 },
391
417
[]int {140 , 140 , 128 , 128 },
392
418
false ,
@@ -403,6 +429,7 @@ func Test_handleGRO(t *testing.T) {
403
429
fields .TOS ++
404
430
}),
405
431
},
432
+ true ,
406
433
[]int {0 , 1 , 2 , 3 },
407
434
[]int {140 , 140 , 128 , 128 },
408
435
false ,
@@ -419,6 +446,7 @@ func Test_handleGRO(t *testing.T) {
419
446
fields .Flags = 1
420
447
}),
421
448
},
449
+ true ,
422
450
[]int {0 , 1 , 2 , 3 },
423
451
[]int {140 , 140 , 128 , 128 },
424
452
false ,
@@ -435,6 +463,7 @@ func Test_handleGRO(t *testing.T) {
435
463
fields .Flags = 2
436
464
}),
437
465
},
466
+ true ,
438
467
[]int {0 , 1 , 2 , 3 },
439
468
[]int {140 , 140 , 128 , 128 },
440
469
false ,
@@ -451,6 +480,7 @@ func Test_handleGRO(t *testing.T) {
451
480
fields .HopLimit ++
452
481
}),
453
482
},
483
+ true ,
454
484
[]int {0 , 1 , 2 , 3 },
455
485
[]int {160 , 160 , 148 , 148 },
456
486
false ,
@@ -467,6 +497,7 @@ func Test_handleGRO(t *testing.T) {
467
497
fields .TrafficClass ++
468
498
}),
469
499
},
500
+ true ,
470
501
[]int {0 , 1 , 2 , 3 },
471
502
[]int {160 , 160 , 148 , 148 },
472
503
false ,
@@ -476,7 +507,7 @@ func Test_handleGRO(t *testing.T) {
476
507
for _ , tt := range tests {
477
508
t .Run (tt .name , func (t * testing.T ) {
478
509
toWrite := make ([]int , 0 , len (tt .pktsIn ))
479
- err := handleGRO (tt .pktsIn , offset , newTCPGROTable (), newUDPGROTable (), & toWrite )
510
+ err := handleGRO (tt .pktsIn , offset , newTCPGROTable (), newUDPGROTable (), tt . canUDPGRO , & toWrite )
480
511
if err != nil {
481
512
if tt .wantErr {
482
513
return
@@ -521,74 +552,99 @@ func Test_packetIsGROCandidate(t *testing.T) {
521
552
udp6TooShort := udp6 [:47 ]
522
553
523
554
tests := []struct {
524
- name string
525
- b []byte
526
- want groCandidateType
555
+ name string
556
+ b []byte
557
+ canUDPGRO bool
558
+ want groCandidateType
527
559
}{
528
560
{
529
561
"tcp4" ,
530
562
tcp4 ,
563
+ true ,
531
564
tcp4GROCandidate ,
532
565
},
533
566
{
534
567
"tcp6" ,
535
568
tcp6 ,
569
+ true ,
536
570
tcp6GROCandidate ,
537
571
},
538
572
{
539
573
"udp4" ,
540
574
udp4 ,
575
+ true ,
541
576
udp4GROCandidate ,
542
577
},
578
+ {
579
+ "udp4 no support" ,
580
+ udp4 ,
581
+ false ,
582
+ notGROCandidate ,
583
+ },
543
584
{
544
585
"udp6" ,
545
586
udp6 ,
587
+ true ,
546
588
udp6GROCandidate ,
547
589
},
590
+ {
591
+ "udp6 no support" ,
592
+ udp6 ,
593
+ false ,
594
+ notGROCandidate ,
595
+ },
548
596
{
549
597
"udp4 too short" ,
550
598
udp4TooShort ,
599
+ true ,
551
600
notGROCandidate ,
552
601
},
553
602
{
554
603
"udp6 too short" ,
555
604
udp6TooShort ,
605
+ true ,
556
606
notGROCandidate ,
557
607
},
558
608
{
559
609
"tcp4 too short" ,
560
610
tcp4TooShort ,
611
+ true ,
561
612
notGROCandidate ,
562
613
},
563
614
{
564
615
"tcp6 too short" ,
565
616
tcp6TooShort ,
617
+ true ,
566
618
notGROCandidate ,
567
619
},
568
620
{
569
621
"invalid IP version" ,
570
622
[]byte {0x00 },
623
+ true ,
571
624
notGROCandidate ,
572
625
},
573
626
{
574
627
"invalid IP header len" ,
575
628
ip4InvalidHeaderLen ,
629
+ true ,
576
630
notGROCandidate ,
577
631
},
578
632
{
579
633
"ip4 invalid protocol" ,
580
634
ip4InvalidProtocol ,
635
+ true ,
581
636
notGROCandidate ,
582
637
},
583
638
{
584
639
"ip6 invalid protocol" ,
585
640
ip6InvalidProtocol ,
641
+ true ,
586
642
notGROCandidate ,
587
643
},
588
644
}
589
645
for _ , tt := range tests {
590
646
t .Run (tt .name , func (t * testing.T ) {
591
- if got := packetIsGROCandidate (tt .b ); got != tt .want {
647
+ if got := packetIsGROCandidate (tt .b , tt . canUDPGRO ); got != tt .want {
592
648
t .Errorf ("packetIsGROCandidate() = %v, want %v" , got , tt .want )
593
649
}
594
650
})
0 commit comments