@@ -11,14 +11,52 @@ import (
11
11
"os/exec"
12
12
"path"
13
13
"path/filepath"
14
+ "regexp"
14
15
"strconv"
15
16
"strings"
16
17
17
18
"github.com/AliyunContainerService/alibabacloud-erdma-controller/internal/types"
19
+ "github.com/AliyunContainerService/alibabacloud-erdma-controller/internal/utils"
18
20
"github.com/samber/lo"
19
21
"github.com/vishvananda/netlink"
20
22
)
21
23
24
+ func checkExpose (instanceID string , exposedLocalERIs []string , rdmaDevice string ) (bool , error ) {
25
+ var unMatchExposeERIs []string
26
+ isMatched := false
27
+ if len (exposedLocalERIs ) == 1 && exposedLocalERIs [0 ] == "" {
28
+ return true , nil
29
+ }
30
+ pattern := `^(i-(?:\w+|\*))\s+((?:(?:\w+)(?:\/\w+)*))$`
31
+ re := regexp .MustCompile (pattern )
32
+ for _ , exposeInfo := range exposedLocalERIs {
33
+ if ! re .MatchString (exposeInfo ) {
34
+ return false , fmt .Errorf ("invalid format %s" , exposeInfo )
35
+ }
36
+ id := strings .SplitN (exposeInfo , " " , 2 )[0 ]
37
+ if instanceID == id {
38
+ isMatched = true
39
+ exposeERIs := strings .Split (strings .TrimSpace (strings .SplitN (exposeInfo , " " , 2 )[1 ]), "/" )
40
+ for _ , dev := range exposeERIs {
41
+ if dev == rdmaDevice {
42
+ return true , nil
43
+ }
44
+ }
45
+ }
46
+ if id == "i-*" {
47
+ unMatchExposeERIs = strings .Split (strings .TrimSpace (strings .SplitN (exposeInfo , " " , 2 )[1 ]), "/" )
48
+ }
49
+ }
50
+ if ! isMatched {
51
+ driverLog .Info ("no matched instanceID found, using unMatchExposeERIs" , "instanceID" , instanceID )
52
+ for _ , dev := range unMatchExposeERIs {
53
+ if dev == "erdma_*" || dev == rdmaDevice {
54
+ return true , nil
55
+ }
56
+ }
57
+ }
58
+ return false , nil
59
+ }
22
60
func driverExists () bool {
23
61
if isContainerOS () {
24
62
_ , err := containerExec ("modinfo erdma" )
@@ -104,14 +142,16 @@ func GetERdmaFromLink(link netlink.Link) (*netlink.RdmaLink, error) {
104
142
}
105
143
linkHwAddr := link .Attrs ().HardwareAddr
106
144
// erdma guid first byte is ^= 0x2
107
- linkHwAddr [0 ] ^= 0x2
145
+ new_linkHwAddr := make (net.HardwareAddr , len (linkHwAddr ))
146
+ copy (new_linkHwAddr , linkHwAddr )
147
+ new_linkHwAddr [0 ] ^= 0x2
108
148
for _ , rl := range rdmaLinks {
109
149
rdmaHwAddr , err := parseERdmaLinkHwAddr (rl .Attrs .NodeGuid )
110
150
if err != nil {
111
151
return nil , err
112
152
}
113
153
driverLog .Info ("check rdma link" , "rdmaLink" , rl .Attrs .Name , "rdmaHwAddr" , rdmaHwAddr .String (), "linkHwAddr" , linkHwAddr .String ())
114
- if rdmaHwAddr .String () == linkHwAddr .String () {
154
+ if rdmaHwAddr .String () == new_linkHwAddr .String () {
115
155
return rl , nil
116
156
}
117
157
}
@@ -203,3 +243,49 @@ func GetERDMANumaNode(info *netlink.RdmaLink) (int64, error) {
203
243
}
204
244
return int64 (numa ), nil
205
245
}
246
+
247
+ const (
248
+ instanceIDAddr = "http://100.100.100.200/latest/meta-data/instance-id"
249
+ )
250
+
251
+ func SelectERIs (exposedLocalERIs []string ) ([]* types.ERI , error ) {
252
+ var selectEriList []* types.ERI
253
+ var isExposed bool
254
+ instanceID , _ := utils .GetStrFromMetadata (instanceIDAddr )
255
+ links , err := netlink .LinkList ()
256
+ if err != nil {
257
+ return nil , fmt .Errorf ("list link failed: %v" , err )
258
+ }
259
+
260
+ for _ , link := range links {
261
+ if _ , ok := link .(* netlink.Device ); ! ok {
262
+ continue
263
+ }
264
+ if link .Attrs ().HardwareAddr != nil {
265
+ rdmaLink , _ := GetERdmaFromLink (link )
266
+ if rdmaLink != nil {
267
+ rdmadevice := rdmaLink .Attrs .Name
268
+ isExposed , err = checkExpose (instanceID , exposedLocalERIs , rdmadevice )
269
+ if isExposed {
270
+ driverLog .Info ("LocalERIDiscovery: expose eri" , "rdmadevice" , rdmadevice , "link name" , link .Attrs ().Name )
271
+ eri := & types.ERI {
272
+ ID : rdmadevice ,
273
+ IsPrimaryENI : link .Attrs ().Name == "eth0" ,
274
+ MAC : link .Attrs ().HardwareAddr .String (),
275
+ InstanceID : instanceID ,
276
+ CardIndex : - 1 ,
277
+ QueuePair : - 1 ,
278
+ }
279
+ selectEriList = append (selectEriList , eri )
280
+ driverLog .Info ("Simple mode SelectERIs: eri" , "eri" , eri )
281
+ } else if err != nil {
282
+ return nil , err
283
+ }
284
+ } else {
285
+ driverLog .Info ("LocalERIDiscovery: link is not rdma device, skip" , "link_name" , link .Attrs ().Name )
286
+ }
287
+ }
288
+ }
289
+
290
+ return selectEriList , nil
291
+ }
0 commit comments