@@ -1277,33 +1277,31 @@ static struct rdma_id_private *cma_find_listener(
1277
1277
}
1278
1278
1279
1279
static struct rdma_id_private * cma_id_from_event (struct ib_cm_id * cm_id ,
1280
- struct ib_cm_event * ib_event )
1280
+ struct ib_cm_event * ib_event ,
1281
+ struct net_device * * net_dev )
1281
1282
{
1282
1283
struct cma_req_info req ;
1283
1284
struct rdma_bind_list * bind_list ;
1284
1285
struct rdma_id_private * id_priv ;
1285
- struct net_device * net_dev ;
1286
1286
int err ;
1287
1287
1288
1288
err = cma_save_req_info (ib_event , & req );
1289
1289
if (err )
1290
1290
return ERR_PTR (err );
1291
1291
1292
- net_dev = cma_get_net_dev (ib_event , & req );
1293
- if (IS_ERR (net_dev )) {
1294
- if (PTR_ERR (net_dev ) == - EAFNOSUPPORT ) {
1292
+ * net_dev = cma_get_net_dev (ib_event , & req );
1293
+ if (IS_ERR (* net_dev )) {
1294
+ if (PTR_ERR (* net_dev ) == - EAFNOSUPPORT ) {
1295
1295
/* Assuming the protocol is AF_IB */
1296
- net_dev = NULL ;
1296
+ * net_dev = NULL ;
1297
1297
} else {
1298
- return ERR_CAST (net_dev );
1298
+ return ERR_CAST (* net_dev );
1299
1299
}
1300
1300
}
1301
1301
1302
1302
bind_list = cma_ps_find (rdma_ps_from_service_id (req .service_id ),
1303
1303
cma_port_from_service_id (req .service_id ));
1304
- id_priv = cma_find_listener (bind_list , cm_id , ib_event , & req , net_dev );
1305
-
1306
- dev_put (net_dev );
1304
+ id_priv = cma_find_listener (bind_list , cm_id , ib_event , & req , * net_dev );
1307
1305
1308
1306
return id_priv ;
1309
1307
}
@@ -1553,7 +1551,8 @@ static int cma_ib_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
1553
1551
}
1554
1552
1555
1553
static struct rdma_id_private * cma_new_conn_id (struct rdma_cm_id * listen_id ,
1556
- struct ib_cm_event * ib_event )
1554
+ struct ib_cm_event * ib_event ,
1555
+ struct net_device * net_dev )
1557
1556
{
1558
1557
struct rdma_id_private * id_priv ;
1559
1558
struct rdma_cm_id * id ;
@@ -1585,14 +1584,16 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
1585
1584
if (rt -> num_paths == 2 )
1586
1585
rt -> path_rec [1 ] = * ib_event -> param .req_rcvd .alternate_path ;
1587
1586
1588
- if (cma_any_addr (cma_src_addr (id_priv ))) {
1589
- rt -> addr .dev_addr .dev_type = ARPHRD_INFINIBAND ;
1590
- rdma_addr_set_sgid (& rt -> addr .dev_addr , & rt -> path_rec [0 ].sgid );
1591
- ib_addr_set_pkey (& rt -> addr .dev_addr , be16_to_cpu (rt -> path_rec [0 ].pkey ));
1592
- } else {
1593
- ret = cma_translate_addr (cma_src_addr (id_priv ), & rt -> addr .dev_addr );
1587
+ if (net_dev ) {
1588
+ ret = rdma_copy_addr (& rt -> addr .dev_addr , net_dev , NULL );
1594
1589
if (ret )
1595
1590
goto err ;
1591
+ } else {
1592
+ /* An AF_IB connection */
1593
+ WARN_ON_ONCE (ss_family != AF_IB );
1594
+
1595
+ cma_translate_ib ((struct sockaddr_ib * )cma_src_addr (id_priv ),
1596
+ & rt -> addr .dev_addr );
1596
1597
}
1597
1598
rdma_addr_set_dgid (& rt -> addr .dev_addr , & rt -> path_rec [0 ].dgid );
1598
1599
@@ -1605,7 +1606,8 @@ static struct rdma_id_private *cma_new_conn_id(struct rdma_cm_id *listen_id,
1605
1606
}
1606
1607
1607
1608
static struct rdma_id_private * cma_new_udp_id (struct rdma_cm_id * listen_id ,
1608
- struct ib_cm_event * ib_event )
1609
+ struct ib_cm_event * ib_event ,
1610
+ struct net_device * net_dev )
1609
1611
{
1610
1612
struct rdma_id_private * id_priv ;
1611
1613
struct rdma_cm_id * id ;
@@ -1624,10 +1626,18 @@ static struct rdma_id_private *cma_new_udp_id(struct rdma_cm_id *listen_id,
1624
1626
ib_event -> param .sidr_req_rcvd .service_id ))
1625
1627
goto err ;
1626
1628
1627
- if (! cma_any_addr (( struct sockaddr * ) & id -> route . addr . src_addr ) ) {
1628
- ret = cma_translate_addr ( cma_src_addr ( id_priv ), & id -> route .addr .dev_addr );
1629
+ if (net_dev ) {
1630
+ ret = rdma_copy_addr ( & id -> route .addr .dev_addr , net_dev , NULL );
1629
1631
if (ret )
1630
1632
goto err ;
1633
+ } else {
1634
+ /* An AF_IB connection */
1635
+ WARN_ON_ONCE (ss_family != AF_IB );
1636
+
1637
+ if (!cma_any_addr (cma_src_addr (id_priv )))
1638
+ cma_translate_ib ((struct sockaddr_ib * )
1639
+ cma_src_addr (id_priv ),
1640
+ & id -> route .addr .dev_addr );
1631
1641
}
1632
1642
1633
1643
id_priv -> state = RDMA_CM_CONNECT ;
@@ -1665,28 +1675,33 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
1665
1675
{
1666
1676
struct rdma_id_private * listen_id , * conn_id ;
1667
1677
struct rdma_cm_event event ;
1678
+ struct net_device * net_dev ;
1668
1679
int offset , ret ;
1669
1680
1670
- listen_id = cma_id_from_event (cm_id , ib_event );
1681
+ listen_id = cma_id_from_event (cm_id , ib_event , & net_dev );
1671
1682
if (IS_ERR (listen_id ))
1672
1683
return PTR_ERR (listen_id );
1673
1684
1674
- if (!cma_check_req_qp_type (& listen_id -> id , ib_event ))
1675
- return - EINVAL ;
1685
+ if (!cma_check_req_qp_type (& listen_id -> id , ib_event )) {
1686
+ ret = - EINVAL ;
1687
+ goto net_dev_put ;
1688
+ }
1676
1689
1677
- if (cma_disable_callback (listen_id , RDMA_CM_LISTEN ))
1678
- return - ECONNABORTED ;
1690
+ if (cma_disable_callback (listen_id , RDMA_CM_LISTEN )) {
1691
+ ret = - ECONNABORTED ;
1692
+ goto net_dev_put ;
1693
+ }
1679
1694
1680
1695
memset (& event , 0 , sizeof event );
1681
1696
offset = cma_user_data_offset (listen_id );
1682
1697
event .event = RDMA_CM_EVENT_CONNECT_REQUEST ;
1683
1698
if (ib_event -> event == IB_CM_SIDR_REQ_RECEIVED ) {
1684
- conn_id = cma_new_udp_id (& listen_id -> id , ib_event );
1699
+ conn_id = cma_new_udp_id (& listen_id -> id , ib_event , net_dev );
1685
1700
event .param .ud .private_data = ib_event -> private_data + offset ;
1686
1701
event .param .ud .private_data_len =
1687
1702
IB_CM_SIDR_REQ_PRIVATE_DATA_SIZE - offset ;
1688
1703
} else {
1689
- conn_id = cma_new_conn_id (& listen_id -> id , ib_event );
1704
+ conn_id = cma_new_conn_id (& listen_id -> id , ib_event , net_dev );
1690
1705
cma_set_req_event_data (& event , & ib_event -> param .req_rcvd ,
1691
1706
ib_event -> private_data , offset );
1692
1707
}
@@ -1724,6 +1739,8 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
1724
1739
mutex_unlock (& conn_id -> handler_mutex );
1725
1740
mutex_unlock (& listen_id -> handler_mutex );
1726
1741
cma_deref_id (conn_id );
1742
+ if (net_dev )
1743
+ dev_put (net_dev );
1727
1744
return 0 ;
1728
1745
1729
1746
err3 :
@@ -1737,6 +1754,11 @@ static int cma_req_handler(struct ib_cm_id *cm_id, struct ib_cm_event *ib_event)
1737
1754
mutex_unlock (& listen_id -> handler_mutex );
1738
1755
if (conn_id )
1739
1756
rdma_destroy_id (& conn_id -> id );
1757
+
1758
+ net_dev_put :
1759
+ if (net_dev )
1760
+ dev_put (net_dev );
1761
+
1740
1762
return ret ;
1741
1763
}
1742
1764
0 commit comments