1 // Copyright 2012 Google, Inc. All rights reserved.
3 // Use of this source code is governed by a BSD-style license
4 // that can be found in the LICENSE file in the root of the source
10 "github.com/google/gopacket"
11 "github.com/google/gopacket/layers"
18 var netFlow gopacket.Flow
21 netFlow, _ = gopacket.FlowFromEndpoints(
22 layers.NewIPEndpoint(net.IP{1, 2, 3, 4}),
23 layers.NewIPEndpoint(net.IP{5, 6, 7, 8}))
26 type testSequence struct {
31 type testFactory struct {
32 reassembly []Reassembly
35 func (t *testFactory) New(a, b gopacket.Flow) Stream {
38 func (t *testFactory) Reassembled(r []Reassembly) {
40 for i := 0; i < len(r); i++ {
41 t.reassembly[i].Seen = time.Time{}
44 func (t *testFactory) ReassemblyComplete() {
47 func test(t *testing.T, s []testSequence) {
48 fact := &testFactory{}
49 p := NewStreamPool(fact)
51 a.MaxBufferedPagesPerConnection = 4
52 for i, test := range s {
53 fact.reassembly = []Reassembly{}
54 a.Assemble(netFlow, &test.in)
55 if !reflect.DeepEqual(fact.reassembly, test.want) {
56 t.Fatalf("test %v:\nwant: %v\n got: %v\n", i, test.want, fact.reassembly)
61 func TestReorder(t *testing.T) {
62 test(t, []testSequence{
68 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}},
77 BaseLayer: layers.BaseLayer{Payload: []byte{2, 2, 3}},
86 BaseLayer: layers.BaseLayer{Payload: []byte{4, 2, 3}},
95 BaseLayer: layers.BaseLayer{Payload: []byte{3, 2, 3}},
100 Bytes: []byte{1, 2, 3},
103 Bytes: []byte{2, 2, 3},
106 Bytes: []byte{3, 2, 3},
109 Bytes: []byte{4, 2, 3},
118 BaseLayer: layers.BaseLayer{Payload: []byte{2, 2, 3}},
120 want: []Reassembly{},
127 BaseLayer: layers.BaseLayer{Payload: []byte{3, 2, 3}},
129 want: []Reassembly{},
136 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}},
140 Bytes: []byte{1, 2, 3},
143 Bytes: []byte{2, 2, 3},
146 Bytes: []byte{3, 2, 3},
153 func TestMaxPerSkip(t *testing.T) {
154 test(t, []testSequence{
161 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}},
166 Bytes: []byte{1, 2, 3},
175 BaseLayer: layers.BaseLayer{Payload: []byte{3, 2, 3}},
177 want: []Reassembly{},
184 BaseLayer: layers.BaseLayer{Payload: []byte{4, 2, 3}},
186 want: []Reassembly{},
193 BaseLayer: layers.BaseLayer{Payload: []byte{5, 2, 3}},
195 want: []Reassembly{},
202 BaseLayer: layers.BaseLayer{Payload: []byte{6, 2, 3}},
207 Bytes: []byte{3, 2, 3},
210 Bytes: []byte{4, 2, 3},
213 Bytes: []byte{5, 2, 3},
216 Bytes: []byte{6, 2, 3},
223 func TestReorderFast(t *testing.T) {
224 test(t, []testSequence{
231 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3}},
236 Bytes: []byte{1, 2, 3},
245 BaseLayer: layers.BaseLayer{Payload: []byte{3, 2, 3}},
247 want: []Reassembly{},
254 BaseLayer: layers.BaseLayer{Payload: []byte{2, 2, 3}},
258 Bytes: []byte{2, 2, 3},
261 Bytes: []byte{3, 2, 3},
268 func TestOverlap(t *testing.T) {
269 test(t, []testSequence{
276 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}},
281 Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
290 BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9, 0, 1, 2, 3, 4, 5}},
294 Bytes: []byte{1, 2, 3, 4, 5},
303 BaseLayer: layers.BaseLayer{Payload: []byte{0, 1, 2, 3, 4, 5, 6, 7}},
314 func TestBufferedOverlap(t *testing.T) {
315 test(t, []testSequence{
321 BaseLayer: layers.BaseLayer{Payload: []byte{7, 8, 9, 0, 1, 2, 3, 4, 5}},
323 want: []Reassembly{},
330 BaseLayer: layers.BaseLayer{Payload: []byte{0, 1, 2, 3, 4, 5, 6, 7}},
332 want: []Reassembly{},
340 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}},
345 Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
348 Bytes: []byte{1, 2, 3, 4, 5},
358 func TestOverrun1(t *testing.T) {
359 test(t, []testSequence{
366 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}},
371 Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
380 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4}},
384 Bytes: []byte{1, 2, 3, 4},
391 func TestOverrun2(t *testing.T) {
392 test(t, []testSequence{
398 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4}},
400 want: []Reassembly{},
408 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}},
413 Bytes: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
416 Bytes: []byte{1, 2, 3, 4},
423 func TestCacheLargePacket(t *testing.T) {
424 data := make([]byte, pageBytes*3)
425 test(t, []testSequence{
431 BaseLayer: layers.BaseLayer{Payload: data},
433 want: []Reassembly{},
441 BaseLayer: layers.BaseLayer{Payload: []byte{}},
449 Bytes: data[:pageBytes],
452 Bytes: data[pageBytes : pageBytes*2],
455 Bytes: data[pageBytes*2 : pageBytes*3],
462 func BenchmarkSingleStream(b *testing.B) {
468 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}},
470 a := NewAssembler(NewStreamPool(&testFactory{}))
471 for i := 0; i < b.N; i++ {
472 a.Assemble(netFlow, &t)
481 func BenchmarkSingleStreamSkips(b *testing.B) {
487 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}},
489 a := NewAssembler(NewStreamPool(&testFactory{}))
491 for i := 0; i < b.N; i++ {
498 a.Assemble(netFlow, &t)
511 func BenchmarkSingleStreamLoss(b *testing.B) {
517 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}},
519 a := NewAssembler(NewStreamPool(&testFactory{}))
520 for i := 0; i < b.N; i++ {
521 a.Assemble(netFlow, &t)
527 func BenchmarkMultiStreamGrow(b *testing.B) {
532 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}},
534 a := NewAssembler(NewStreamPool(&testFactory{}))
535 for i := 0; i < b.N; i++ {
536 t.SrcPort = layers.TCPPort(i)
537 a.Assemble(netFlow, &t)
542 func BenchmarkMultiStreamConn(b *testing.B) {
548 BaseLayer: layers.BaseLayer{Payload: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}},
550 a := NewAssembler(NewStreamPool(&testFactory{}))
551 for i := 0; i < b.N; i++ {
552 t.SrcPort = layers.TCPPort(i)
553 a.Assemble(netFlow, &t)
554 if i%65536 == 65535 {