@@ -453,11 +453,13 @@ static int llc_exec_conn_trans_actions(struct sock *sk,
453453static inline bool llc_estab_match (const struct llc_sap * sap ,
454454 const struct llc_addr * daddr ,
455455 const struct llc_addr * laddr ,
456- const struct sock * sk )
456+ const struct sock * sk ,
457+ const struct net * net )
457458{
458459 struct llc_sock * llc = llc_sk (sk );
459460
460- return llc -> laddr .lsap == laddr -> lsap &&
461+ return net_eq (sock_net (sk ), net ) &&
462+ llc -> laddr .lsap == laddr -> lsap &&
461463 llc -> daddr .lsap == daddr -> lsap &&
462464 ether_addr_equal (llc -> laddr .mac , laddr -> mac ) &&
463465 ether_addr_equal (llc -> daddr .mac , daddr -> mac );
@@ -468,6 +470,7 @@ static inline bool llc_estab_match(const struct llc_sap *sap,
468470 * @sap: SAP
469471 * @daddr: address of remote LLC (MAC + SAP)
470472 * @laddr: address of local LLC (MAC + SAP)
473+ * @net: netns to look up a socket in
471474 *
472475 * Search connection list of the SAP and finds connection using the remote
473476 * 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,
476479 */
477480static struct sock * __llc_lookup_established (struct llc_sap * sap ,
478481 struct llc_addr * daddr ,
479- struct llc_addr * laddr )
482+ struct llc_addr * laddr ,
483+ const struct net * net )
480484{
481485 struct sock * rc ;
482486 struct hlist_nulls_node * node ;
@@ -486,12 +490,12 @@ static struct sock *__llc_lookup_established(struct llc_sap *sap,
486490 rcu_read_lock ();
487491again :
488492 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 )) {
490494 /* Extra checks required by SLAB_TYPESAFE_BY_RCU */
491495 if (unlikely (!refcount_inc_not_zero (& rc -> sk_refcnt )))
492496 goto again ;
493497 if (unlikely (llc_sk (rc )-> sap != sap ||
494- !llc_estab_match (sap , daddr , laddr , rc ))) {
498+ !llc_estab_match (sap , daddr , laddr , rc , net ))) {
495499 sock_put (rc );
496500 continue ;
497501 }
@@ -513,29 +517,33 @@ static struct sock *__llc_lookup_established(struct llc_sap *sap,
513517
514518struct sock * llc_lookup_established (struct llc_sap * sap ,
515519 struct llc_addr * daddr ,
516- struct llc_addr * laddr )
520+ struct llc_addr * laddr ,
521+ const struct net * net )
517522{
518523 struct sock * sk ;
519524
520525 local_bh_disable ();
521- sk = __llc_lookup_established (sap , daddr , laddr );
526+ sk = __llc_lookup_established (sap , daddr , laddr , net );
522527 local_bh_enable ();
523528 return sk ;
524529}
525530
526531static inline bool llc_listener_match (const struct llc_sap * sap ,
527532 const struct llc_addr * laddr ,
528- const struct sock * sk )
533+ const struct sock * sk ,
534+ const struct net * net )
529535{
530536 struct llc_sock * llc = llc_sk (sk );
531537
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 &&
533540 llc -> laddr .lsap == laddr -> lsap &&
534541 ether_addr_equal (llc -> laddr .mac , laddr -> mac );
535542}
536543
537544static struct sock * __llc_lookup_listener (struct llc_sap * sap ,
538- struct llc_addr * laddr )
545+ struct llc_addr * laddr ,
546+ const struct net * net )
539547{
540548 struct sock * rc ;
541549 struct hlist_nulls_node * node ;
@@ -545,12 +553,12 @@ static struct sock *__llc_lookup_listener(struct llc_sap *sap,
545553 rcu_read_lock ();
546554again :
547555 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 )) {
549557 /* Extra checks required by SLAB_TYPESAFE_BY_RCU */
550558 if (unlikely (!refcount_inc_not_zero (& rc -> sk_refcnt )))
551559 goto again ;
552560 if (unlikely (llc_sk (rc )-> sap != sap ||
553- !llc_listener_match (sap , laddr , rc ))) {
561+ !llc_listener_match (sap , laddr , rc , net ))) {
554562 sock_put (rc );
555563 continue ;
556564 }
@@ -574,31 +582,34 @@ static struct sock *__llc_lookup_listener(struct llc_sap *sap,
574582 * llc_lookup_listener - Finds listener for local MAC + SAP
575583 * @sap: SAP
576584 * @laddr: address of local LLC (MAC + SAP)
585+ * @net: netns to look up a socket in
577586 *
578587 * Search connection list of the SAP and finds connection listening on
579588 * local mac, and local sap. Returns pointer for parent socket found,
580589 * %NULL otherwise.
581590 * Caller has to make sure local_bh is disabled.
582591 */
583592static struct sock * llc_lookup_listener (struct llc_sap * sap ,
584- struct llc_addr * laddr )
593+ struct llc_addr * laddr ,
594+ const struct net * net )
585595{
596+ struct sock * rc = __llc_lookup_listener (sap , laddr , net );
586597 static struct llc_addr null_addr ;
587- struct sock * rc = __llc_lookup_listener (sap , laddr );
588598
589599 if (!rc )
590- rc = __llc_lookup_listener (sap , & null_addr );
600+ rc = __llc_lookup_listener (sap , & null_addr , net );
591601
592602 return rc ;
593603}
594604
595605static struct sock * __llc_lookup (struct llc_sap * sap ,
596606 struct llc_addr * daddr ,
597- struct llc_addr * laddr )
607+ struct llc_addr * laddr ,
608+ const struct net * net )
598609{
599- struct sock * sk = __llc_lookup_established (sap , daddr , laddr );
610+ struct sock * sk = __llc_lookup_established (sap , daddr , laddr , net );
600611
601- return sk ? : llc_lookup_listener (sap , laddr );
612+ return sk ? : llc_lookup_listener (sap , laddr , net );
602613}
603614
604615/**
@@ -776,7 +787,7 @@ void llc_conn_handler(struct llc_sap *sap, struct sk_buff *skb)
776787 llc_pdu_decode_da (skb , daddr .mac );
777788 llc_pdu_decode_dsap (skb , & daddr .lsap );
778789
779- sk = __llc_lookup (sap , & saddr , & daddr );
790+ sk = __llc_lookup (sap , & saddr , & daddr , dev_net ( skb -> dev ) );
780791 if (!sk )
781792 goto drop ;
782793
0 commit comments