Skip to content

Commit 31f4a6b

Browse files
committed
UCT/IB/ROCE: Use ipv6 non link-local GID in priority
1 parent 179a0e7 commit 31f4a6b

File tree

1 file changed

+18
-7
lines changed

1 file changed

+18
-7
lines changed

src/uct/ib/base/ib_device.c

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,11 @@ const char *uct_ib_gid_str(const union ibv_gid *gid, char *str, size_t max_size)
849849
return str;
850850
}
851851

852+
static int uct_ib_gid_is_ipv6_ll(const union ibv_gid *gid)
853+
{
854+
return ((gid->raw[0] == 0xfe) && ((gid->raw[1] & 0xc0) == 0x80));
855+
}
856+
852857
static int uct_ib_device_is_addr_ipv4_mcast(const struct in6_addr *raw,
853858
const uint32_t addr_last_bits)
854859
{
@@ -1074,11 +1079,16 @@ uct_ib_device_select_gid(uct_ib_device_t *dev, uint8_t port_num,
10741079
uct_ib_device_gid_info_t *gid_info)
10751080
{
10761081
static const size_t max_str_len = 200;
1077-
static const uct_ib_roce_version_info_t roce_prio[] = {
1078-
{UCT_IB_DEVICE_ROCE_V2, AF_INET},
1079-
{UCT_IB_DEVICE_ROCE_V2, AF_INET6},
1080-
{UCT_IB_DEVICE_ROCE_V1, AF_INET},
1081-
{UCT_IB_DEVICE_ROCE_V1, AF_INET6}
1082+
struct {
1083+
uct_ib_roce_version_info_t info;
1084+
int skip_ll; /* link-local not allowed when true */
1085+
} roce_prio[] = {
1086+
{{UCT_IB_DEVICE_ROCE_V2, AF_INET}},
1087+
{{UCT_IB_DEVICE_ROCE_V2, AF_INET6}, 1},
1088+
{{UCT_IB_DEVICE_ROCE_V2, AF_INET6}},
1089+
{{UCT_IB_DEVICE_ROCE_V1, AF_INET}},
1090+
{{UCT_IB_DEVICE_ROCE_V2, AF_INET6}, 1},
1091+
{{UCT_IB_DEVICE_ROCE_V1, AF_INET6}}
10821092
};
10831093
int gid_tbl_len = uct_ib_device_port_attr(dev, port_num)->gid_tbl_len;
10841094
ucs_status_t status = UCS_OK;
@@ -1108,8 +1118,9 @@ uct_ib_device_select_gid(uct_ib_device_t *dev, uint8_t port_num,
11081118
goto out;
11091119
}
11101120

1111-
if ((roce_prio[prio_idx].ver == gid_info_tmp.roce_info.ver) &&
1112-
(roce_prio[prio_idx].addr_family == gid_info_tmp.roce_info.addr_family) &&
1121+
if ((roce_prio[prio_idx].info.ver == gid_info_tmp.roce_info.ver) &&
1122+
(roce_prio[prio_idx].info.addr_family == gid_info_tmp.roce_info.addr_family) &&
1123+
(!roce_prio[prio_idx].skip_ll || !uct_ib_gid_is_ipv6_ll(&gid_info_tmp.gid)) &&
11131124
uct_ib_device_test_roce_gid_index(dev, port_num, &gid_info_tmp.gid, i) &&
11141125
uct_ib_device_match_roce_subnet(&gid_info_tmp, &subnets,
11151126
subnet_strs->mode)) {

0 commit comments

Comments
 (0)