-
Notifications
You must be signed in to change notification settings - Fork 4
/
capture_trace.go
74 lines (59 loc) · 1.59 KB
/
capture_trace.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
// SPDX-FileCopyrightText: 2023 Steffen Vogel <post@steffenvogel.de>
// SPDX-License-Identifier: Apache-2.0
package gont
import (
"io"
"github.com/gopacket/gopacket"
"github.com/gopacket/gopacket/layers"
"github.com/stv0g/gont/v2/pkg/trace"
)
const (
LinkTypeUser0 = 147
LinkTypeTrace = LinkTypeUser0
)
var _ packetSource = (*traceEventPacketSource)(nil)
type traceEventPacketSource struct {
tracepoints chan trace.Event
count uint64
}
func newTracepointPacketSource() *traceEventPacketSource {
return &traceEventPacketSource{
tracepoints: make(chan trace.Event),
}
}
func (tps *traceEventPacketSource) ReadPacketData() (data []byte, ci gopacket.CaptureInfo, err error) {
tps.count++
tp, ok := <-tps.tracepoints
if !ok {
return nil, gopacket.CaptureInfo{}, io.EOF
}
return SerializePacket(&tp)
}
func (tps *traceEventPacketSource) Stats() (captureStats, error) {
return captureStats{
PacketsReceived: tps.count,
}, nil
}
func (tps *traceEventPacketSource) LinkType() layers.LinkType {
// TODO: Register our own DLT value?
// https://www.tcpdump.org/linktypes.html
return LinkTypeTrace
}
func (tps *traceEventPacketSource) SourceTracepoint(tp trace.Event) {
tps.tracepoints <- tp
}
func (tps *traceEventPacketSource) Close() error {
// close(tps.tracepoints)
return nil
}
func SerializePacket(t *trace.Event) (data []byte, ci gopacket.CaptureInfo, err error) {
buf, err := t.Marshal()
if err != nil {
return nil, gopacket.CaptureInfo{}, err
}
return buf, gopacket.CaptureInfo{
Timestamp: t.Timestamp,
Length: len(buf),
CaptureLength: len(buf),
}, nil
}