@@ -3544,10 +3544,12 @@ static int cma_resolve_ib_addr(struct rdma_id_private *id_priv)
35443544static int cma_bind_addr (struct rdma_cm_id * id , struct sockaddr * src_addr ,
35453545 const struct sockaddr * dst_addr )
35463546{
3547+ struct rdma_id_private * id_priv =
3548+ container_of (id , struct rdma_id_private , id );
35473549 struct sockaddr_storage zero_sock = {};
35483550
35493551 if (src_addr && src_addr -> sa_family )
3550- return rdma_bind_addr ( id , src_addr );
3552+ return rdma_bind_addr_dst ( id_priv , src_addr , dst_addr );
35513553
35523554 /*
35533555 * When the src_addr is not specified, automatically supply an any addr
@@ -3567,7 +3569,7 @@ static int cma_bind_addr(struct rdma_cm_id *id, struct sockaddr *src_addr,
35673569 ((struct sockaddr_ib * )& zero_sock )-> sib_pkey =
35683570 ((struct sockaddr_ib * )dst_addr )-> sib_pkey ;
35693571 }
3570- return rdma_bind_addr ( id , (struct sockaddr * )& zero_sock );
3572+ return rdma_bind_addr_dst ( id_priv , (struct sockaddr * )& zero_sock , dst_addr );
35713573}
35723574
35733575/*
@@ -3582,17 +3584,15 @@ static int resolve_prepare_src(struct rdma_id_private *id_priv,
35823584{
35833585 int ret ;
35843586
3585- memcpy (cma_dst_addr (id_priv ), dst_addr , rdma_addr_size (dst_addr ));
35863587 if (!cma_comp_exch (id_priv , RDMA_CM_ADDR_BOUND , RDMA_CM_ADDR_QUERY )) {
35873588 /* For a well behaved ULP state will be RDMA_CM_IDLE */
35883589 ret = cma_bind_addr (& id_priv -> id , src_addr , dst_addr );
35893590 if (ret )
3590- goto err_dst ;
3591+ return ret ;
35913592 if (WARN_ON (!cma_comp_exch (id_priv , RDMA_CM_ADDR_BOUND ,
3592- RDMA_CM_ADDR_QUERY ))) {
3593- ret = - EINVAL ;
3594- goto err_dst ;
3595- }
3593+ RDMA_CM_ADDR_QUERY )))
3594+ return - EINVAL ;
3595+
35963596 }
35973597
35983598 if (cma_family (id_priv ) != dst_addr -> sa_family ) {
@@ -3603,8 +3603,6 @@ static int resolve_prepare_src(struct rdma_id_private *id_priv,
36033603
36043604err_state :
36053605 cma_comp_exch (id_priv , RDMA_CM_ADDR_QUERY , RDMA_CM_ADDR_BOUND );
3606- err_dst :
3607- memset (cma_dst_addr (id_priv ), 0 , rdma_addr_size (dst_addr ));
36083606 return ret ;
36093607}
36103608
@@ -4058,27 +4056,26 @@ int rdma_listen(struct rdma_cm_id *id, int backlog)
40584056}
40594057EXPORT_SYMBOL (rdma_listen );
40604058
4061- int rdma_bind_addr (struct rdma_cm_id * id , struct sockaddr * addr )
4059+ static int rdma_bind_addr_dst (struct rdma_id_private * id_priv ,
4060+ struct sockaddr * addr , const struct sockaddr * daddr )
40624061{
4063- struct rdma_id_private * id_priv ;
4062+ struct sockaddr * id_daddr ;
40644063 int ret ;
4065- struct sockaddr * daddr ;
40664064
40674065 if (addr -> sa_family != AF_INET && addr -> sa_family != AF_INET6 &&
40684066 addr -> sa_family != AF_IB )
40694067 return - EAFNOSUPPORT ;
40704068
4071- id_priv = container_of (id , struct rdma_id_private , id );
40724069 if (!cma_comp_exch (id_priv , RDMA_CM_IDLE , RDMA_CM_ADDR_BOUND ))
40734070 return - EINVAL ;
40744071
4075- ret = cma_check_linklocal (& id -> route .addr .dev_addr , addr );
4072+ ret = cma_check_linklocal (& id_priv -> id . route .addr .dev_addr , addr );
40764073 if (ret )
40774074 goto err1 ;
40784075
40794076 memcpy (cma_src_addr (id_priv ), addr , rdma_addr_size (addr ));
40804077 if (!cma_any_addr (addr )) {
4081- ret = cma_translate_addr (addr , & id -> route .addr .dev_addr );
4078+ ret = cma_translate_addr (addr , & id_priv -> id . route .addr .dev_addr );
40824079 if (ret )
40834080 goto err1 ;
40844081
@@ -4098,8 +4095,10 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
40984095 }
40994096#endif
41004097 }
4101- daddr = cma_dst_addr (id_priv );
4102- daddr -> sa_family = addr -> sa_family ;
4098+ id_daddr = cma_dst_addr (id_priv );
4099+ if (daddr != id_daddr )
4100+ memcpy (id_daddr , daddr , rdma_addr_size (addr ));
4101+ id_daddr -> sa_family = addr -> sa_family ;
41034102
41044103 ret = cma_get_port (id_priv );
41054104 if (ret )
@@ -4115,6 +4114,14 @@ int rdma_bind_addr(struct rdma_cm_id *id, struct sockaddr *addr)
41154114 cma_comp_exch (id_priv , RDMA_CM_ADDR_BOUND , RDMA_CM_IDLE );
41164115 return ret ;
41174116}
4117+
4118+ int rdma_bind_addr (struct rdma_cm_id * id , struct sockaddr * addr )
4119+ {
4120+ struct rdma_id_private * id_priv =
4121+ container_of (id , struct rdma_id_private , id );
4122+
4123+ return rdma_bind_addr_dst (id_priv , addr , cma_dst_addr (id_priv ));
4124+ }
41184125EXPORT_SYMBOL (rdma_bind_addr );
41194126
41204127static int cma_format_hdr (void * hdr , struct rdma_id_private * id_priv )
0 commit comments