]> git.baikalelectronics.ru Git - kernel.git/commit
RDMA/core: Document confusing code
authorGustavo A. R. Silva <garsilva@embeddedor.com>
Fri, 5 May 2017 01:38:20 +0000 (20:38 -0500)
committerDoug Ledford <dledford@redhat.com>
Mon, 17 Jul 2017 15:45:17 +0000 (11:45 -0400)
commit62e66555cf111d574f0219e85709d7c44410a189
treebbeb4a92cb379a238023e9e5a9c779500f49bdfc
parent07f0aa116286085009e3e439651b42dd0dabe507
RDMA/core: Document confusing code

While looking into Coverity ID 1351047 I ran into the following
piece of code at
drivers/infiniband/core/verbs.c:496:

ret = rdma_addr_find_l2_eth_by_grh(&dgid, &sgid,
                                   ah_attr->dmac,
                                   wc->wc_flags & IB_WC_WITH_VLAN ?
                                   NULL : &vlan_id,
                                   &if_index, &hoplimit);

The issue here is that the position of arguments in the call to
rdma_addr_find_l2_eth_by_grh() function do not match the order of
the parameters:

&dgid is passed to sgid
&sgid is passed to dgid

This is the function prototype:

int rdma_addr_find_l2_eth_by_grh(const union ib_gid *sgid,
   const union ib_gid *dgid,
   u8 *dmac, u16 *vlan_id, int *if_index,
   int *hoplimit)

My question here is if this is intentional?

Answer:
Yes. ib_init_ah_from_wc() creates ah from the incoming packet.
Incoming packet has dgid of the receiver node on which this code is
getting executed and sgid contains the GID of the sender.

When resolving mac address of destination, you use arrived dgid as
sgid and use sgid as dgid because sgid contains destinations GID whom to
respond to.

Signed-off-by: Gustavo A. R. Silva <garsilva@embeddedor.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/core/verbs.c