Skip to content

Commit c33185c

Browse files
fuweidaboch
authored andcommitted
rdma: support rdma link add/del functionality
Signed-off-by: Wei Fu <fuweid89@gmail.com>
1 parent 626202e commit c33185c

File tree

3 files changed

+96
-1
lines changed

3 files changed

+96
-1
lines changed

nl/rdma_link_linux.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ const (
1111
const (
1212
RDMA_NLDEV_CMD_GET = 1
1313
RDMA_NLDEV_CMD_SET = 2
14+
RDMA_NLDEV_CMD_NEWLINK = 3
15+
RDMA_NLDEV_CMD_DELLINK = 4
1416
RDMA_NLDEV_CMD_SYS_GET = 6
1517
RDMA_NLDEV_CMD_SYS_SET = 7
1618
)
@@ -30,6 +32,8 @@ const (
3032
RDMA_NLDEV_ATTR_PORT_STATE = 12
3133
RDMA_NLDEV_ATTR_PORT_PHYS_STATE = 13
3234
RDMA_NLDEV_ATTR_DEV_NODE_TYPE = 14
35+
RDMA_NLDEV_ATTR_NDEV_NAME = 51
36+
RDMA_NLDEV_ATTR_LINK_TYPE = 65
3337
RDMA_NLDEV_SYS_ATTR_NETNS_MODE = 66
3438
RDMA_NLDEV_NET_NS_FD = 68
3539
)

rdma_link_linux.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,3 +278,54 @@ func (h *Handle) RdmaLinkSetNsFd(link *RdmaLink, fd uint32) error {
278278

279279
return execRdmaSetLink(req)
280280
}
281+
282+
// RdmaLinkDel deletes an rdma link
283+
//
284+
// Similar to: rdma link delete NAME
285+
// REF: https://man7.org/linux/man-pages/man8/rdma-link.8.html
286+
func RdmaLinkDel(name string) error {
287+
return pkgHandle.RdmaLinkDel(name)
288+
}
289+
290+
// RdmaLinkDel deletes an rdma link.
291+
func (h *Handle) RdmaLinkDel(name string) error {
292+
link, err := h.RdmaLinkByName(name)
293+
if err != nil {
294+
return err
295+
}
296+
297+
proto := getProtoField(nl.RDMA_NL_NLDEV, nl.RDMA_NLDEV_CMD_DELLINK)
298+
req := h.newNetlinkRequest(proto, unix.NLM_F_ACK)
299+
300+
b := make([]byte, 4)
301+
native.PutUint32(b, link.Attrs.Index)
302+
req.AddData(nl.NewRtAttr(nl.RDMA_NLDEV_ATTR_DEV_INDEX, b))
303+
304+
_, err = req.Execute(unix.NETLINK_RDMA, 0)
305+
return err
306+
}
307+
308+
// RdmaLinkAdd adds an rdma link for the specified type to the network device.
309+
// Similar to: rdma link add NAME type TYPE netdev NETDEV
310+
// NAME - specifies the new name of the rdma link to add
311+
// TYPE - specifies which rdma type to use. Link types:
312+
// rxe - Soft RoCE driver
313+
// siw - Soft iWARP driver
314+
// NETDEV - specifies the network device to which the link is bound
315+
//
316+
// REF: https://man7.org/linux/man-pages/man8/rdma-link.8.html
317+
func RdmaLinkAdd(linkName, linkType, netdev string) error {
318+
return pkgHandle.RdmaLinkAdd(linkName, linkType, netdev)
319+
}
320+
321+
// RdmaLinkAdd adds an rdma link for the specified type to the network device.
322+
func (h *Handle) RdmaLinkAdd(linkName string, linkType string, netdev string) error {
323+
proto := getProtoField(nl.RDMA_NL_NLDEV, nl.RDMA_NLDEV_CMD_NEWLINK)
324+
req := h.newNetlinkRequest(proto, unix.NLM_F_ACK)
325+
326+
req.AddData(nl.NewRtAttr(nl.RDMA_NLDEV_ATTR_DEV_NAME, nl.ZeroTerminated(linkName)))
327+
req.AddData(nl.NewRtAttr(nl.RDMA_NLDEV_ATTR_LINK_TYPE, nl.ZeroTerminated(linkType)))
328+
req.AddData(nl.NewRtAttr(nl.RDMA_NLDEV_ATTR_NDEV_NAME, nl.ZeroTerminated(netdev)))
329+
_, err := req.Execute(unix.NETLINK_RDMA, 0)
330+
return err
331+
}

rdma_link_test.go

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33
package netlink
44

55
import (
6-
"github.com/vishvananda/netns"
76
"io/ioutil"
87
"strings"
98
"testing"
9+
10+
"github.com/vishvananda/netns"
1011
)
1112

1213
func setupRdmaKModule(t *testing.T, name string) {
@@ -165,3 +166,42 @@ func TestRdmaLinkList(t *testing.T) {
165166
t.Logf("%d: %s", link.Attrs.Index, link.Attrs.Name)
166167
}
167168
}
169+
170+
func TestRdmaLinkAddAndDel(t *testing.T) {
171+
// related commit is https://github.com/torvalds/linux/commit/3856ec4b93c9463d36ee39098dde1fbbd29ec6dd.
172+
minKernelRequired(t, 5, 1)
173+
setupRdmaKModule(t, "rdma_rxe")
174+
175+
checkPresence := func(name string, exist bool) {
176+
links, err := RdmaLinkList()
177+
if err != nil {
178+
t.Fatal(err)
179+
}
180+
181+
found := false
182+
for _, link := range links {
183+
if link.Attrs.Name == name {
184+
found = true
185+
break
186+
}
187+
}
188+
189+
if found != exist {
190+
t.Fatalf("expected rdma link %s presence=%v, but got presence=%v", name, exist, found)
191+
}
192+
}
193+
194+
linkName := t.Name()
195+
196+
if err := RdmaLinkAdd(linkName, "rxe", "lo"); err != nil {
197+
t.Fatal(err)
198+
}
199+
200+
checkPresence(linkName, true)
201+
202+
if err := RdmaLinkDel(linkName); err != nil {
203+
t.Fatal(err)
204+
}
205+
206+
checkPresence(linkName, false)
207+
}

0 commit comments

Comments
 (0)