@@ -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+
852857static 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