@@ -1404,6 +1404,24 @@ static void cm_format_paths_from_req(struct cm_req_msg *req_msg,
1404
1404
}
1405
1405
}
1406
1406
1407
+ static u16 cm_get_bth_pkey (struct cm_work * work )
1408
+ {
1409
+ struct ib_device * ib_dev = work -> port -> cm_dev -> ib_device ;
1410
+ u8 port_num = work -> port -> port_num ;
1411
+ u16 pkey_index = work -> mad_recv_wc -> wc -> pkey_index ;
1412
+ u16 pkey ;
1413
+ int ret ;
1414
+
1415
+ ret = ib_get_cached_pkey (ib_dev , port_num , pkey_index , & pkey );
1416
+ if (ret ) {
1417
+ dev_warn_ratelimited (& ib_dev -> dev , "ib_cm: Couldn't retrieve pkey for incoming request (port %d, pkey index %d). %d\n" ,
1418
+ port_num , pkey_index , ret );
1419
+ return 0 ;
1420
+ }
1421
+
1422
+ return pkey ;
1423
+ }
1424
+
1407
1425
static void cm_format_req_event (struct cm_work * work ,
1408
1426
struct cm_id_private * cm_id_priv ,
1409
1427
struct ib_cm_id * listen_id )
@@ -1414,6 +1432,7 @@ static void cm_format_req_event(struct cm_work *work,
1414
1432
req_msg = (struct cm_req_msg * )work -> mad_recv_wc -> recv_buf .mad ;
1415
1433
param = & work -> cm_event .param .req_rcvd ;
1416
1434
param -> listen_id = listen_id ;
1435
+ param -> bth_pkey = cm_get_bth_pkey (work );
1417
1436
param -> port = cm_id_priv -> av .port -> port_num ;
1418
1437
param -> primary_path = & work -> path [0 ];
1419
1438
if (req_msg -> alt_local_lid )
@@ -3105,6 +3124,7 @@ static void cm_format_sidr_req_event(struct cm_work *work,
3105
3124
param -> pkey = __be16_to_cpu (sidr_req_msg -> pkey );
3106
3125
param -> listen_id = listen_id ;
3107
3126
param -> service_id = sidr_req_msg -> service_id ;
3127
+ param -> bth_pkey = cm_get_bth_pkey (work );
3108
3128
param -> port = work -> port -> port_num ;
3109
3129
work -> cm_event .private_data = & sidr_req_msg -> private_data ;
3110
3130
}
0 commit comments