@@ -370,6 +370,7 @@ static void mctp_test_route_input_sk(struct kunit *test)
370
370
#define FL_S (MCTP_HDR_FLAG_SOM)
371
371
#define FL_E (MCTP_HDR_FLAG_EOM)
372
372
#define FL_TO (MCTP_HDR_FLAG_TO)
373
+ #define FL_T (t ) ((t) & MCTP_HDR_TAG_MASK)
373
374
374
375
static const struct mctp_route_input_sk_test mctp_route_input_sk_tests [] = {
375
376
{ .hdr = RX_HDR (1 , 10 , 8 , FL_S | FL_E | FL_TO ), .type = 0 , .deliver = true },
@@ -522,12 +523,148 @@ static void mctp_route_input_sk_reasm_to_desc(
522
523
KUNIT_ARRAY_PARAM (mctp_route_input_sk_reasm , mctp_route_input_sk_reasm_tests ,
523
524
mctp_route_input_sk_reasm_to_desc );
524
525
526
+ struct mctp_route_input_sk_keys_test {
527
+ const char * name ;
528
+ mctp_eid_t key_peer_addr ;
529
+ mctp_eid_t key_local_addr ;
530
+ u8 key_tag ;
531
+ struct mctp_hdr hdr ;
532
+ bool deliver ;
533
+ };
534
+
535
+ /* test packet rx in the presence of various key configurations */
536
+ static void mctp_test_route_input_sk_keys (struct kunit * test )
537
+ {
538
+ const struct mctp_route_input_sk_keys_test * params ;
539
+ struct mctp_test_route * rt ;
540
+ struct sk_buff * skb , * skb2 ;
541
+ struct mctp_test_dev * dev ;
542
+ struct mctp_sk_key * key ;
543
+ struct netns_mctp * mns ;
544
+ struct mctp_sock * msk ;
545
+ struct socket * sock ;
546
+ unsigned long flags ;
547
+ int rc ;
548
+ u8 c ;
549
+
550
+ params = test -> param_value ;
551
+
552
+ dev = mctp_test_create_dev ();
553
+ KUNIT_ASSERT_NOT_ERR_OR_NULL (test , dev );
554
+
555
+ rt = mctp_test_create_route (& init_net , dev -> mdev , 8 , 68 );
556
+ KUNIT_ASSERT_NOT_ERR_OR_NULL (test , rt );
557
+
558
+ rc = sock_create_kern (& init_net , AF_MCTP , SOCK_DGRAM , 0 , & sock );
559
+ KUNIT_ASSERT_EQ (test , rc , 0 );
560
+
561
+ msk = container_of (sock -> sk , struct mctp_sock , sk );
562
+ mns = & sock_net (sock -> sk )-> mctp ;
563
+
564
+ /* set the incoming tag according to test params */
565
+ key = mctp_key_alloc (msk , params -> key_local_addr , params -> key_peer_addr ,
566
+ params -> key_tag , GFP_KERNEL );
567
+
568
+ KUNIT_ASSERT_NOT_ERR_OR_NULL (test , key );
569
+
570
+ spin_lock_irqsave (& mns -> keys_lock , flags );
571
+ mctp_reserve_tag (& init_net , key , msk );
572
+ spin_unlock_irqrestore (& mns -> keys_lock , flags );
573
+
574
+ /* create packet and route */
575
+ c = 0 ;
576
+ skb = mctp_test_create_skb_data (& params -> hdr , & c );
577
+ KUNIT_ASSERT_NOT_ERR_OR_NULL (test , skb );
578
+
579
+ skb -> dev = dev -> ndev ;
580
+ __mctp_cb (skb );
581
+
582
+ rc = mctp_route_input (& rt -> rt , skb );
583
+
584
+ /* (potentially) receive message */
585
+ skb2 = skb_recv_datagram (sock -> sk , 0 , 1 , & rc );
586
+
587
+ if (params -> deliver )
588
+ KUNIT_EXPECT_NOT_ERR_OR_NULL (test , skb2 );
589
+ else
590
+ KUNIT_EXPECT_PTR_EQ (test , skb2 , NULL );
591
+
592
+ if (skb2 )
593
+ skb_free_datagram (sock -> sk , skb2 );
594
+
595
+ mctp_key_unref (key );
596
+ __mctp_route_test_fini (test , dev , rt , sock );
597
+ }
598
+
599
+ static const struct mctp_route_input_sk_keys_test mctp_route_input_sk_keys_tests [] = {
600
+ {
601
+ .name = "direct match" ,
602
+ .key_peer_addr = 9 ,
603
+ .key_local_addr = 8 ,
604
+ .key_tag = 1 ,
605
+ .hdr = RX_HDR (1 , 9 , 8 , FL_S | FL_E | FL_T (1 )),
606
+ .deliver = true,
607
+ },
608
+ {
609
+ .name = "flipped src/dest" ,
610
+ .key_peer_addr = 8 ,
611
+ .key_local_addr = 9 ,
612
+ .key_tag = 1 ,
613
+ .hdr = RX_HDR (1 , 9 , 8 , FL_S | FL_E | FL_T (1 )),
614
+ .deliver = false,
615
+ },
616
+ {
617
+ .name = "peer addr mismatch" ,
618
+ .key_peer_addr = 9 ,
619
+ .key_local_addr = 8 ,
620
+ .key_tag = 1 ,
621
+ .hdr = RX_HDR (1 , 10 , 8 , FL_S | FL_E | FL_T (1 )),
622
+ .deliver = false,
623
+ },
624
+ {
625
+ .name = "tag value mismatch" ,
626
+ .key_peer_addr = 9 ,
627
+ .key_local_addr = 8 ,
628
+ .key_tag = 1 ,
629
+ .hdr = RX_HDR (1 , 9 , 8 , FL_S | FL_E | FL_T (2 )),
630
+ .deliver = false,
631
+ },
632
+ {
633
+ .name = "TO mismatch" ,
634
+ .key_peer_addr = 9 ,
635
+ .key_local_addr = 8 ,
636
+ .key_tag = 1 ,
637
+ .hdr = RX_HDR (1 , 9 , 8 , FL_S | FL_E | FL_T (1 ) | FL_TO ),
638
+ .deliver = false,
639
+ },
640
+ {
641
+ .name = "broadcast response" ,
642
+ .key_peer_addr = MCTP_ADDR_ANY ,
643
+ .key_local_addr = 8 ,
644
+ .key_tag = 1 ,
645
+ .hdr = RX_HDR (1 , 11 , 8 , FL_S | FL_E | FL_T (1 )),
646
+ .deliver = true,
647
+ },
648
+ };
649
+
650
+ static void mctp_route_input_sk_keys_to_desc (
651
+ const struct mctp_route_input_sk_keys_test * t ,
652
+ char * desc )
653
+ {
654
+ sprintf (desc , "%s" , t -> name );
655
+ }
656
+
657
+ KUNIT_ARRAY_PARAM (mctp_route_input_sk_keys , mctp_route_input_sk_keys_tests ,
658
+ mctp_route_input_sk_keys_to_desc );
659
+
525
660
static struct kunit_case mctp_test_cases [] = {
526
661
KUNIT_CASE_PARAM (mctp_test_fragment , mctp_frag_gen_params ),
527
662
KUNIT_CASE_PARAM (mctp_test_rx_input , mctp_rx_input_gen_params ),
528
663
KUNIT_CASE_PARAM (mctp_test_route_input_sk , mctp_route_input_sk_gen_params ),
529
664
KUNIT_CASE_PARAM (mctp_test_route_input_sk_reasm ,
530
665
mctp_route_input_sk_reasm_gen_params ),
666
+ KUNIT_CASE_PARAM (mctp_test_route_input_sk_keys ,
667
+ mctp_route_input_sk_keys_gen_params ),
531
668
{}
532
669
};
533
670
0 commit comments