@@ -78,6 +78,8 @@ var _ = Describe("DiscoverSriovDevices", func() {
7878 mockHost .EXPECT ().GetPCIeRoot ("0000:01:00.0" ).Return ("pci0000:00" , nil )
7979 mockHost .EXPECT ().GetParentPciAddress ("0000:01:00.0" ).Return ("0000:00:01.0" , nil )
8080 mockHost .EXPECT ().GetVFList ("0000:01:00.0" ).Return (vfList , nil )
81+ mockHost .EXPECT ().VerifyRDMACapability ("0000:01:00.1" ).Return (false , nil )
82+ mockHost .EXPECT ().VerifyRDMACapability ("0000:01:00.2" ).Return (false , nil )
8183
8284 devices , err := DiscoverSriovDevices ()
8385 Expect (err ).NotTo (HaveOccurred ())
@@ -149,7 +151,9 @@ var _ = Describe("DiscoverSriovDevices", func() {
149151 mockHost .EXPECT ().GetParentPciAddress ("0000:02:00.0" ).Return ("0000:00:02.0" , nil )
150152
151153 mockHost .EXPECT ().GetVFList ("0000:01:00.0" ).Return (vfList1 , nil )
154+ mockHost .EXPECT ().VerifyRDMACapability ("0000:01:00.1" ).Return (false , nil )
152155 mockHost .EXPECT ().GetVFList ("0000:02:00.0" ).Return (vfList2 , nil )
156+ mockHost .EXPECT ().VerifyRDMACapability ("0000:02:00.1" ).Return (false , nil )
153157
154158 devices , err := DiscoverSriovDevices ()
155159 Expect (err ).NotTo (HaveOccurred ())
@@ -198,14 +202,15 @@ var _ = Describe("DiscoverSriovDevices", func() {
198202 mockHost .EXPECT ().GetPCIeRoot ("0000:01:00.0" ).Return ("" , nil )
199203 mockHost .EXPECT ().GetParentPciAddress ("0000:01:00.0" ).Return ("" , nil )
200204 mockHost .EXPECT ().GetVFList ("0000:01:00.0" ).Return (vfList , nil )
205+ mockHost .EXPECT ().VerifyRDMACapability ("0000:01:00.1" ).Return (false , nil )
201206
202207 devices , err := DiscoverSriovDevices ()
203208 Expect (err ).NotTo (HaveOccurred ())
204209 Expect (devices ).To (HaveLen (1 ))
205210
206- // NUMA should default to 0
211+ // NUMA should default to -1 (not supported)
207212 dev := devices ["0000-01-00-1" ]
208- Expect (dev .Attributes [consts .AttributeNumaNode ].IntValue ).To (Equal (ptr .To (int64 (0 ))))
213+ Expect (dev .Attributes [consts .AttributeNumaNode ].IntValue ).To (Equal (ptr .To (int64 (- 1 ))))
209214 // Standard PCI address should still be set
210215 Expect (dev .Attributes [consts .AttributeStandardPciAddress ].StringValue ).To (Equal (ptr .To ("0000:01:00.1" )))
211216 })
@@ -234,6 +239,7 @@ var _ = Describe("DiscoverSriovDevices", func() {
234239 mockHost .EXPECT ().GetPCIeRoot ("0000:01:00.0" ).Return ("" , nil )
235240 mockHost .EXPECT ().GetParentPciAddress ("0000:01:00.0" ).Return ("" , fmt .Errorf ("parent not found" ))
236241 mockHost .EXPECT ().GetVFList ("0000:01:00.0" ).Return (vfList , nil )
242+ mockHost .EXPECT ().VerifyRDMACapability ("0000:01:00.1" ).Return (false , nil )
237243
238244 devices , err := DiscoverSriovDevices ()
239245 Expect (err ).NotTo (HaveOccurred ())
@@ -245,6 +251,110 @@ var _ = Describe("DiscoverSriovDevices", func() {
245251 // Standard PCI address should still be set
246252 Expect (dev .Attributes [consts .AttributeStandardPciAddress ].StringValue ).To (Equal (ptr .To ("0000:01:00.1" )))
247253 })
254+
255+ It ("should discover RDMA-capable VFs with RDMA attributes" , func () {
256+ pciInfo := & pci.Info {
257+ Devices : []* pci.Device {
258+ {
259+ Address : "0000:01:00.0" ,
260+ Class : & pcidb.Class {ID : "02" },
261+ Vendor : & pcidb.Vendor {ID : "15b3" }, // Mellanox
262+ Product : & pcidb.Product {ID : "1017" }, // ConnectX-5
263+ },
264+ },
265+ }
266+
267+ vfList := []host.VFInfo {
268+ {
269+ PciAddress : "0000:01:00.1" ,
270+ VFID : 0 ,
271+ DeviceID : "1018" ,
272+ },
273+ {
274+ PciAddress : "0000:01:00.2" ,
275+ VFID : 1 ,
276+ DeviceID : "1018" ,
277+ },
278+ }
279+
280+ mockHost .EXPECT ().PCI ().Return (pciInfo , nil )
281+ mockHost .EXPECT ().IsSriovVF ("0000:01:00.0" ).Return (false )
282+ mockHost .EXPECT ().TryGetInterfaceName ("0000:01:00.0" ).Return ("ib0" )
283+ mockHost .EXPECT ().GetNicSriovMode ("0000:01:00.0" ).Return ("switchdev" )
284+ mockHost .EXPECT ().GetNumaNode ("0000:01:00.0" ).Return ("1" , nil )
285+ mockHost .EXPECT ().GetPCIeRoot ("0000:01:00.0" ).Return ("pci0000:00" , nil )
286+ mockHost .EXPECT ().GetParentPciAddress ("0000:01:00.0" ).Return ("0000:00:01.0" , nil )
287+ mockHost .EXPECT ().GetVFList ("0000:01:00.0" ).Return (vfList , nil )
288+
289+ // First VF is RDMA-capable
290+ mockHost .EXPECT ().VerifyRDMACapability ("0000:01:00.1" ).Return (true , nil )
291+
292+ // Second VF is not RDMA-capable
293+ mockHost .EXPECT ().VerifyRDMACapability ("0000:01:00.2" ).Return (false , nil )
294+
295+ devices , err := DiscoverSriovDevices ()
296+ Expect (err ).NotTo (HaveOccurred ())
297+ Expect (devices ).To (HaveLen (2 ))
298+
299+ // Check first VF (RDMA-capable)
300+ dev1 := devices ["0000-01-00-1" ]
301+ Expect (dev1 .Name ).To (Equal ("0000-01-00-1" ))
302+ Expect (dev1 .Attributes [consts .AttributeVendorID ].StringValue ).To (Equal (ptr .To ("15b3" )))
303+ Expect (dev1 .Attributes [consts .AttributeDeviceID ].StringValue ).To (Equal (ptr .To ("1018" )))
304+ Expect (dev1 .Attributes [consts .AttributePFDeviceID ].StringValue ).To (Equal (ptr .To ("1017" )))
305+ Expect (dev1 .Attributes [consts .AttributePciAddress ].StringValue ).To (Equal (ptr .To ("0000:01:00.1" )))
306+ Expect (dev1 .Attributes [consts .AttributePFName ].StringValue ).To (Equal (ptr .To ("ib0" )))
307+ Expect (dev1 .Attributes [consts .AttributeEswitchMode ].StringValue ).To (Equal (ptr .To ("switchdev" )))
308+ Expect (dev1 .Attributes [consts .AttributeVFID ].IntValue ).To (Equal (ptr .To (int64 (0 ))))
309+ Expect (dev1 .Attributes [consts .AttributeNumaNode ].IntValue ).To (Equal (ptr .To (int64 (1 ))))
310+ Expect (dev1 .Attributes [consts .AttributePCIeRoot ].StringValue ).To (Equal (ptr .To ("pci0000:00" )))
311+ Expect (dev1 .Attributes [consts .AttributeParentPciAddress ].StringValue ).To (Equal (ptr .To ("0000:00:01.0" )))
312+ Expect (dev1 .Attributes [consts .AttributeStandardPciAddress ].StringValue ).To (Equal (ptr .To ("0000:01:00.1" )))
313+ // RDMA-specific attributes
314+ Expect (dev1 .Attributes [consts .AttributeRDMACapable ].BoolValue ).To (Equal (ptr .To (true )))
315+
316+ // Check second VF (not RDMA-capable)
317+ dev2 := devices ["0000-01-00-2" ]
318+ Expect (dev2 .Name ).To (Equal ("0000-01-00-2" ))
319+ Expect (dev2 .Attributes [consts .AttributeVFID ].IntValue ).To (Equal (ptr .To (int64 (1 ))))
320+ Expect (dev2 .Attributes [consts .AttributeRDMACapable ].BoolValue ).To (Equal (ptr .To (false )))
321+ })
322+
323+ It ("should handle RDMA capability check errors gracefully" , func () {
324+ pciInfo := & pci.Info {
325+ Devices : []* pci.Device {
326+ {
327+ Address : "0000:01:00.0" ,
328+ Class : & pcidb.Class {ID : "02" },
329+ Vendor : & pcidb.Vendor {ID : "15b3" },
330+ Product : & pcidb.Product {ID : "1017" },
331+ },
332+ },
333+ }
334+
335+ vfList := []host.VFInfo {
336+ {PciAddress : "0000:01:00.1" , VFID : 0 , DeviceID : "1018" },
337+ }
338+
339+ mockHost .EXPECT ().PCI ().Return (pciInfo , nil )
340+ mockHost .EXPECT ().IsSriovVF ("0000:01:00.0" ).Return (false )
341+ mockHost .EXPECT ().TryGetInterfaceName ("0000:01:00.0" ).Return ("ib0" )
342+ mockHost .EXPECT ().GetNicSriovMode ("0000:01:00.0" ).Return ("switchdev" )
343+ mockHost .EXPECT ().GetNumaNode ("0000:01:00.0" ).Return ("0" , nil )
344+ mockHost .EXPECT ().GetPCIeRoot ("0000:01:00.0" ).Return ("pci0000:00" , nil )
345+ mockHost .EXPECT ().GetParentPciAddress ("0000:01:00.0" ).Return ("0000:00:01.0" , nil )
346+ mockHost .EXPECT ().GetVFList ("0000:01:00.0" ).Return (vfList , nil )
347+ // RDMA capability check fails
348+ mockHost .EXPECT ().VerifyRDMACapability ("0000:01:00.1" ).Return (false , fmt .Errorf ("failed to verify RDMA" ))
349+
350+ devices , err := DiscoverSriovDevices ()
351+ Expect (err ).NotTo (HaveOccurred ())
352+ Expect (devices ).To (HaveLen (1 ))
353+
354+ // Should default to not RDMA capable
355+ dev := devices ["0000-01-00-1" ]
356+ Expect (dev .Attributes [consts .AttributeRDMACapable ].BoolValue ).To (Equal (ptr .To (false )))
357+ })
248358 })
249359
250360 Context ("Filtering Cases" , func () {
@@ -307,6 +417,7 @@ var _ = Describe("DiscoverSriovDevices", func() {
307417 mockHost .EXPECT ().GetPCIeRoot ("0000:01:00.0" ).Return ("" , nil )
308418 mockHost .EXPECT ().GetParentPciAddress ("0000:01:00.0" ).Return ("" , nil )
309419 mockHost .EXPECT ().GetVFList ("0000:01:00.0" ).Return (vfList , nil )
420+ mockHost .EXPECT ().VerifyRDMACapability ("0000:01:00.1" ).Return (false , nil )
310421
311422 // Second device (VF) - should be skipped
312423 mockHost .EXPECT ().IsSriovVF ("0000:01:00.1" ).Return (true )
@@ -436,6 +547,7 @@ var _ = Describe("DiscoverSriovDevices", func() {
436547 mockHost .EXPECT ().GetPCIeRoot ("0000:01:00.0" ).Return ("" , nil )
437548 mockHost .EXPECT ().GetParentPciAddress ("0000:01:00.0" ).Return ("" , nil )
438549 mockHost .EXPECT ().GetVFList ("0000:01:00.0" ).Return (vfList , nil )
550+ mockHost .EXPECT ().VerifyRDMACapability ("0000:af:10.7" ).Return (false , nil )
439551
440552 devices , err := DiscoverSriovDevices ()
441553 Expect (err ).NotTo (HaveOccurred ())
0 commit comments