@@ -453,11 +453,13 @@ static int llc_exec_conn_trans_actions(struct sock *sk,
453
453
static inline bool llc_estab_match (const struct llc_sap * sap ,
454
454
const struct llc_addr * daddr ,
455
455
const struct llc_addr * laddr ,
456
- const struct sock * sk )
456
+ const struct sock * sk ,
457
+ const struct net * net )
457
458
{
458
459
struct llc_sock * llc = llc_sk (sk );
459
460
460
- return llc -> laddr .lsap == laddr -> lsap &&
461
+ return net_eq (sock_net (sk ), net ) &&
462
+ llc -> laddr .lsap == laddr -> lsap &&
461
463
llc -> daddr .lsap == daddr -> lsap &&
462
464
ether_addr_equal (llc -> laddr .mac , laddr -> mac ) &&
463
465
ether_addr_equal (llc -> daddr .mac , daddr -> mac );
@@ -468,6 +470,7 @@ static inline bool llc_estab_match(const struct llc_sap *sap,
468
470
* @sap: SAP
469
471
* @daddr: address of remote LLC (MAC + SAP)
470
472
* @laddr: address of local LLC (MAC + SAP)
473
+ * @net: netns to look up a socket in
471
474
*
472
475
* Search connection list of the SAP and finds connection using the remote
473
476
* mac, remote sap, local mac, and local sap. Returns pointer for
@@ -476,7 +479,8 @@ static inline bool llc_estab_match(const struct llc_sap *sap,
476
479
*/
477
480
static struct sock * __llc_lookup_established (struct llc_sap * sap ,
478
481
struct llc_addr * daddr ,
479
- struct llc_addr * laddr )
482
+ struct llc_addr * laddr ,
483
+ const struct net * net )
480
484
{
481
485
struct sock * rc ;
482
486
struct hlist_nulls_node * node ;
@@ -486,12 +490,12 @@ static struct sock *__llc_lookup_established(struct llc_sap *sap,
486
490
rcu_read_lock ();
487
491
again :
488
492
sk_nulls_for_each_rcu (rc , node , laddr_hb ) {
489
- if (llc_estab_match (sap , daddr , laddr , rc )) {
493
+ if (llc_estab_match (sap , daddr , laddr , rc , net )) {
490
494
/* Extra checks required by SLAB_TYPESAFE_BY_RCU */
491
495
if (unlikely (!refcount_inc_not_zero (& rc -> sk_refcnt )))
492
496
goto again ;
493
497
if (unlikely (llc_sk (rc )-> sap != sap ||
494
- !llc_estab_match (sap , daddr , laddr , rc ))) {
498
+ !llc_estab_match (sap , daddr , laddr , rc , net ))) {
495
499
sock_put (rc );
496
500
continue ;
497
501
}
@@ -513,29 +517,33 @@ static struct sock *__llc_lookup_established(struct llc_sap *sap,
513
517
514
518
struct sock * llc_lookup_established (struct llc_sap * sap ,
515
519
struct llc_addr * daddr ,
516
- struct llc_addr * laddr )
520
+ struct llc_addr * laddr ,
521
+ const struct net * net )
517
522
{
518
523
struct sock * sk ;
519
524
520
525
local_bh_disable ();
521
- sk = __llc_lookup_established (sap , daddr , laddr );
526
+ sk = __llc_lookup_established (sap , daddr , laddr , net );
522
527
local_bh_enable ();
523
528
return sk ;
524
529
}
525
530
526
531
static inline bool llc_listener_match (const struct llc_sap * sap ,
527
532
const struct llc_addr * laddr ,
528
- const struct sock * sk )
533
+ const struct sock * sk ,
534
+ const struct net * net )
529
535
{
530
536
struct llc_sock * llc = llc_sk (sk );
531
537
532
- return sk -> sk_type == SOCK_STREAM && sk -> sk_state == TCP_LISTEN &&
538
+ return net_eq (sock_net (sk ), net ) &&
539
+ sk -> sk_type == SOCK_STREAM && sk -> sk_state == TCP_LISTEN &&
533
540
llc -> laddr .lsap == laddr -> lsap &&
534
541
ether_addr_equal (llc -> laddr .mac , laddr -> mac );
535
542
}
536
543
537
544
static struct sock * __llc_lookup_listener (struct llc_sap * sap ,
538
- struct llc_addr * laddr )
545
+ struct llc_addr * laddr ,
546
+ const struct net * net )
539
547
{
540
548
struct sock * rc ;
541
549
struct hlist_nulls_node * node ;
@@ -545,12 +553,12 @@ static struct sock *__llc_lookup_listener(struct llc_sap *sap,
545
553
rcu_read_lock ();
546
554
again :
547
555
sk_nulls_for_each_rcu (rc , node , laddr_hb ) {
548
- if (llc_listener_match (sap , laddr , rc )) {
556
+ if (llc_listener_match (sap , laddr , rc , net )) {
549
557
/* Extra checks required by SLAB_TYPESAFE_BY_RCU */
550
558
if (unlikely (!refcount_inc_not_zero (& rc -> sk_refcnt )))
551
559
goto again ;
552
560
if (unlikely (llc_sk (rc )-> sap != sap ||
553
- !llc_listener_match (sap , laddr , rc ))) {
561
+ !llc_listener_match (sap , laddr , rc , net ))) {
554
562
sock_put (rc );
555
563
continue ;
556
564
}
@@ -574,31 +582,34 @@ static struct sock *__llc_lookup_listener(struct llc_sap *sap,
574
582
* llc_lookup_listener - Finds listener for local MAC + SAP
575
583
* @sap: SAP
576
584
* @laddr: address of local LLC (MAC + SAP)
585
+ * @net: netns to look up a socket in
577
586
*
578
587
* Search connection list of the SAP and finds connection listening on
579
588
* local mac, and local sap. Returns pointer for parent socket found,
580
589
* %NULL otherwise.
581
590
* Caller has to make sure local_bh is disabled.
582
591
*/
583
592
static struct sock * llc_lookup_listener (struct llc_sap * sap ,
584
- struct llc_addr * laddr )
593
+ struct llc_addr * laddr ,
594
+ const struct net * net )
585
595
{
596
+ struct sock * rc = __llc_lookup_listener (sap , laddr , net );
586
597
static struct llc_addr null_addr ;
587
- struct sock * rc = __llc_lookup_listener (sap , laddr );
588
598
589
599
if (!rc )
590
- rc = __llc_lookup_listener (sap , & null_addr );
600
+ rc = __llc_lookup_listener (sap , & null_addr , net );
591
601
592
602
return rc ;
593
603
}
594
604
595
605
static struct sock * __llc_lookup (struct llc_sap * sap ,
596
606
struct llc_addr * daddr ,
597
- struct llc_addr * laddr )
607
+ struct llc_addr * laddr ,
608
+ const struct net * net )
598
609
{
599
- struct sock * sk = __llc_lookup_established (sap , daddr , laddr );
610
+ struct sock * sk = __llc_lookup_established (sap , daddr , laddr , net );
600
611
601
- return sk ? : llc_lookup_listener (sap , laddr );
612
+ return sk ? : llc_lookup_listener (sap , laddr , net );
602
613
}
603
614
604
615
/**
@@ -776,7 +787,7 @@ void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb)
776
787
llc_pdu_decode_da (skb , daddr .mac );
777
788
llc_pdu_decode_dsap (skb , & daddr .lsap );
778
789
779
- sk = __llc_lookup (sap , & saddr , & daddr );
790
+ sk = __llc_lookup (sap , & saddr , & daddr , dev_net ( skb -> dev ) );
780
791
if (!sk )
781
792
goto drop ;
782
793
0 commit comments