Skip to content

add ring-based PMD support #23

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ethdev/cgo_shared.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,6 @@ package ethdev

/*
#cgo pkg-config: libdpdk
#cgo LDFLAGS: -lrte_net_ring
*/
import "C"
30 changes: 29 additions & 1 deletion ethdev/ethdev.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ package ethdev
#include <net/if.h>

#include <rte_config.h>
#include <rte_ring.h>
#include <rte_errno.h>
#include <rte_memory.h>
#include <rte_ethdev.h>
#include <rte_version.h>
#include <rte_eth_ring.h>

// The max_rx_pkt_len changes occurred in commit: 1bb4a528c41f4af4847bd3d58cc2b2b9f1ec9a27.
#if RTE_VERSION < RTE_VERSION_NUM(21, 11, 0, 0)
Expand Down Expand Up @@ -92,6 +92,7 @@ import (

"github.com/yerden/go-dpdk/common"
"github.com/yerden/go-dpdk/mempool"
"github.com/yerden/go-dpdk/ring"
)

// This enum indicates the flow control mode.
Expand Down Expand Up @@ -947,3 +948,30 @@ func (pid Port) FlowCtrlGet(conf *FcConf) error {
func (pid Port) FlowCtrlSet(conf *FcConf) error {
return errget(C.rte_eth_dev_flow_ctrl_set(C.ushort(pid), (*C.struct_rte_eth_fc_conf)(conf)))
}

func fromRings(rings []*ring.Ring) (p **C.struct_rte_ring, n C.uint) {
if n = C.uint(len(rings)); n > 0 {
p = (**C.struct_rte_ring)(unsafe.Pointer(&rings[0]))
}
return
}

// FromRings creates new ethdev port from a set of rings. rxqs and
// txqs represent RX and TX queues, socket is the NUMA node, name is
// to be given to the new port.
func FromRings(name string, rxqs, txqs []*ring.Ring, socket int) (Port, error) {
rxq, nrx := fromRings(rxqs)
txq, ntx := fromRings(txqs)
cname := C.CString(name)
defer C.free(unsafe.Pointer(cname))
rc := C.rte_eth_from_rings(cname, rxq, nrx, txq, ntx, C.uint(socket))
n, err := common.IntOrErr(rc)
return Port(n), err
}

// FromRing creates new ethdev port from a ring.
func FromRing(r *ring.Ring) (Port, error) {
rc := C.rte_eth_from_ring((*C.struct_rte_ring)(unsafe.Pointer(r)))
n, err := common.IntOrErr(rc)
return Port(n), err
}
70 changes: 70 additions & 0 deletions ethdev/ethdev_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,61 @@ import (
"testing"

"github.com/yerden/go-dpdk/eal"
"github.com/yerden/go-dpdk/mempool"
"github.com/yerden/go-dpdk/ring"
)

func TestPortFromRing(t *testing.T) {
eal.InitOnceSafe("test", 4)
r, err := ring.NewEAL("test_ring", 128)
assert(t, err == nil, err)
defer r.Free()

pid, err := FromRing(r)
assert(t, err == nil)
defer pid.Close()

err = pid.DevConfigure(1, 1)
assert(t, err == nil)

mp, err := mempool.CreateMbufPool("test_mp", 1024, 2048)
assert(t, err == nil, err)
defer mp.Free()

err = pid.RxqSetup(0, 128, mp)
assert(t, err == nil, err)

err = pid.TxqSetup(0, 128)
assert(t, err == nil, err)
}

func TestPortFromRings(t *testing.T) {
eal.InitOnceSafe("test", 4)
r1, err := ring.NewEAL("test_ring1", 128)
assert(t, err == nil, err)
defer r1.Free()
r2, err := ring.NewEAL("test_ring2", 128)
assert(t, err == nil, err)
defer r2.Free()

pid, err := FromRings("test_port", []*ring.Ring{r1, r2}, []*ring.Ring{r1, r2}, 0)
assert(t, err == nil)
defer pid.Close()

err = pid.DevConfigure(2, 2)
assert(t, err == nil)

mp, err := mempool.CreateMbufPool("test_mp", 1024, 2048)
assert(t, err == nil, err)
defer mp.Free()

err = pid.RxqSetup(0, 128, mp)
assert(t, err == nil, err)

err = pid.TxqSetup(0, 128)
assert(t, err == nil, err)
}

func TestMACAddr(t *testing.T) {
eal.InitOnceSafe("test", 4)

Expand All @@ -15,6 +68,9 @@ func TestMACAddr(t *testing.T) {
var a MACAddr
err := pid.MACAddrGet(&a)
assert(t, err == nil, err)

hwAddr := a.HardwareAddr()
assert(t, hwAddr.String() != "")
}

func TestRssHashConfGet(t *testing.T) {
Expand Down Expand Up @@ -55,3 +111,17 @@ func TestPortName(t *testing.T) {
_, err = GetPortByName("some_name")
assert(t, err == syscall.ENODEV)
}

func TestRssHashUpdate(t *testing.T) {
eal.InitOnceSafe("test", 4)

pid := Port(0)

conf := &RssConf{
Key: make([]byte, 40),
Hf: 0,
}

err := pid.RssHashUpdate(conf)
assert(t, err == nil)
}