• Gustavo A. R. Silva's avatar
    RDMA/core: Document confusing code · 28b5b3a2
    Gustavo A. R. Silva authored
    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: default avatarGustavo A. R. Silva <garsilva@embeddedor.com>
    Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
    28b5b3a2
verbs.c 54.4 KB