예제 #1
0
void uct_ib_iface_fill_ah_attr(uct_ib_iface_t *iface, const uct_ib_address_t *ib_addr,
                               uint8_t path_bits, struct ibv_ah_attr *ah_attr)
{
    uint8_t is_global;

    memset(ah_attr, 0, sizeof(*ah_attr));

    uct_ib_address_unpack(ib_addr, &ah_attr->dlid, &is_global, &ah_attr->grh.dgid);
    ah_attr->sl            = iface->config.sl;
    ah_attr->src_path_bits = path_bits;
    ah_attr->dlid         |= path_bits;
    ah_attr->port_num      = iface->config.port_num;

    /* Create a global address only if we cannot reach the destination using local
     * address. It means either an Ethernet address, or IB address on a different subnet.
     */
    if (is_global &&
        ((iface->addr_type == UCT_IB_ADDRESS_TYPE_ETH) ||
         (iface->gid.global.subnet_prefix != ah_attr->grh.dgid.global.subnet_prefix)))
    {
        ah_attr->is_global      = 1;
        ah_attr->grh.sgid_index = iface->config.gid_index;
    } else {
        ah_attr->is_global      = 0;
    }
}
예제 #2
0
int uct_ib_iface_is_reachable(const uct_iface_h tl_iface, const uct_device_addr_t *dev_addr,
                              const uct_iface_addr_t *iface_addr)
{
    uct_ib_iface_t *iface = ucs_derived_of(tl_iface, uct_ib_iface_t);
    const uct_ib_address_t *ib_addr = (const void*)dev_addr;
    union ibv_gid gid;
    uint8_t is_global;
    uint16_t lid;

    uct_ib_address_unpack(ib_addr, &lid, &is_global, &gid);

    switch (iface->addr_type) {
    case UCT_IB_ADDRESS_TYPE_LINK_LOCAL:
        /* IB */
        return ib_addr->flags & UCT_IB_ADDRESS_FLAG_LINK_LAYER_IB;
    case UCT_IB_ADDRESS_TYPE_SITE_LOCAL:
    case UCT_IB_ADDRESS_TYPE_GLOBAL:
        /* IB + same subnet prefix */
        return (ib_addr->flags & UCT_IB_ADDRESS_FLAG_LINK_LAYER_IB) &&
               (gid.global.subnet_prefix == iface->gid.global.subnet_prefix);
    case UCT_IB_ADDRESS_TYPE_ETH:
        /* there shouldn't be a lid and the gid flag should be on */
        return (ib_addr->flags & UCT_IB_ADDRESS_FLAG_LINK_LAYER_ETH) &&
               (ib_addr->flags & UCT_IB_ADDRESS_FLAG_GID) &&
               !(ib_addr->flags & UCT_IB_ADDRESS_FLAG_LID);
    default:
        return 0;
    }
}
예제 #3
0
파일: ib_iface.c 프로젝트: xinzhao3/ucx
void uct_ib_iface_fill_ah_attr(uct_ib_iface_t *iface, const uct_ib_address_t *ib_addr,
                               uint8_t src_path_bits, struct ibv_ah_attr *ah_attr)
{
    memset(ah_attr, 0, sizeof(*ah_attr));

    uct_ib_address_unpack(ib_addr, &ah_attr->dlid, &ah_attr->is_global,
                          &ah_attr->grh.dgid);
    ah_attr->sl            = iface->sl;
    ah_attr->src_path_bits = src_path_bits;
    ah_attr->port_num      = iface->port_num;
}
예제 #4
0
파일: ib_iface.c 프로젝트: xinzhao3/ucx
int uct_ib_iface_is_reachable(const uct_iface_h tl_iface, const uct_device_addr_t *dev_addr,
                              const uct_iface_addr_t *iface_addr)
{
    uct_ib_iface_t *iface = ucs_derived_of(tl_iface, uct_ib_iface_t);
    const uct_ib_address_t *ib_addr = (const void*)dev_addr;
    union ibv_gid gid;
    uint8_t is_global;
    uint16_t lid;

    uct_ib_address_unpack(ib_addr, &lid, &is_global, &gid);
    return (gid.global.subnet_prefix == iface->gid.global.subnet_prefix);
}