forked from usnistgov/ndn-dpdk
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest_test.go
141 lines (125 loc) · 3.86 KB
/
test_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package ethface_test
import (
"io"
"sync"
"testing"
"github.com/gopacket/gopacket"
"github.com/gopacket/gopacket/layers"
"github.com/usnistgov/ndn-dpdk/core/testenv"
"github.com/usnistgov/ndn-dpdk/dpdk/eal"
"github.com/usnistgov/ndn-dpdk/dpdk/ealtestenv"
"github.com/usnistgov/ndn-dpdk/dpdk/ealthread"
"github.com/usnistgov/ndn-dpdk/dpdk/ethdev"
"github.com/usnistgov/ndn-dpdk/dpdk/ethdev/ethringdev"
"github.com/usnistgov/ndn-dpdk/dpdk/pktmbuf"
"github.com/usnistgov/ndn-dpdk/dpdk/pktmbuf/mbuftestenv"
"github.com/usnistgov/ndn-dpdk/iface"
"github.com/usnistgov/ndn-dpdk/iface/ethface"
"github.com/usnistgov/ndn-dpdk/iface/ethport"
"github.com/usnistgov/ndn-dpdk/ndn/packettransport"
"github.com/usnistgov/ndn-dpdk/ndni"
"github.com/usnistgov/ndn-dpdk/ndni/ndnitestenv"
"go4.org/must"
)
func TestMain(m *testing.M) {
ealtestenv.Init()
pktmbuf.Direct.Update(pktmbuf.PoolConfig{
Dataroom: 9000, // needed by fragmentation test case
Capacity: 16383,
})
testenv.Exit(m.Run())
}
var (
makeAR = testenv.MakeAR
makePacket = mbuftestenv.MakePacket
makeInterest = ndnitestenv.MakeInterest
randBytes = testenv.RandBytes
)
// createVNet creates a VNet from config template, and schedules its cleanup.
//
// Faces and ports must be closed before closing VNet. One way to ensure this condition is
// calling `defer iface.CloseAll()` or `ifacetestenv.NewFixture` after this function.
func createVNet(t testing.TB, cfg ethringdev.VNetConfig) *ethringdev.VNet {
_, require := makeAR(t)
cfg.RxPool = ndni.PacketMempool.Get(eal.NumaSocket{})
vnet, e := ethringdev.NewVNet(cfg)
require.NoError(e)
t.Cleanup(func() { must.Close(vnet) })
ealthread.AllocLaunch(vnet)
return vnet
}
// ensurePorts creates a Port for each EthDev on the VNet, if it doesn't already have one.
func ensurePorts(t testing.TB, devs []ethdev.EthDev, cfg ethport.Config) {
_, require := makeAR(t)
for _, dev := range devs {
if ethport.Find(dev) != nil {
continue
}
cfg.EthDev = dev
_, e := ethport.New(cfg)
require.NoError(e)
}
}
func makeEtherLocator(dev ethdev.EthDev) (loc ethface.EtherLocator) {
loc.Local.HardwareAddr = dev.HardwareAddr()
loc.Remote.HardwareAddr = packettransport.MulticastAddressNDN
return
}
func parseLocator(j string) ethport.Locator {
locw := testenv.FromJSON[iface.LocatorWrapper](j)
return locw.Locator.(ethport.Locator)
}
var serializeBufferPool = sync.Pool{
New: func() any { return gopacket.NewSerializeBuffer() },
}
func packetFromLayers(hdrs ...gopacket.SerializableLayer) (b []byte, discard func()) {
type TransportLayer interface {
SetNetworkLayerForChecksum(l gopacket.NetworkLayer) error
}
var netLayer gopacket.NetworkLayer
for _, hdr := range hdrs {
switch layer := hdr.(type) {
case gopacket.NetworkLayer:
netLayer = layer
case TransportLayer:
if netLayer != nil {
layer.SetNetworkLayerForChecksum(netLayer)
}
}
}
buf := serializeBufferPool.Get().(gopacket.SerializeBuffer)
if e := gopacket.SerializeLayers(buf, gopacket.SerializeOptions{
FixLengths: true,
ComputeChecksums: true,
}, hdrs...); e != nil {
panic(e)
}
return buf.Bytes(), func() {
buf.Clear()
serializeBufferPool.Put(buf)
}
}
func writeToFromLayers(w io.Writer, hdrs ...gopacket.SerializableLayer) (n int, e error) {
b, discard := packetFromLayers(hdrs...)
defer discard()
return w.Write(b)
}
func pktmbufFromLayers(hdrs ...gopacket.SerializableLayer) *pktmbuf.Packet {
b, discard := packetFromLayers(hdrs...)
defer discard()
return makePacket(mbuftestenv.Headroom(0), b)
}
// makeGTPv1U constructs a GTPv1U layer.
//
// pduType: 0=downlink, 1=uplink
func makeGTPv1U(teid uint32, pduType uint8, qfi uint8) *layers.GTPv1U {
return &layers.GTPv1U{
Version: 1,
ProtocolType: 1,
MessageType: 0xFF,
TEID: teid,
GTPExtensionHeaders: []layers.GTPExtensionHeader{
{Type: 0x85, Content: []byte{pduType << 4, qfi & 0x3F}},
},
}
}