Skip to content

Commit f3aad7d

Browse files
committed
refactor(packet): redesign as nested Packet with optional layers
Replace the tagged-union API (PacketInfo interface + TCPInfo/UDPInfo/ ICMPInfo/ARPInfo + PacketType + UnmarshalPacketInfo) with a single Packet struct that exposes each layer as an optional pointer (Ether/IPv4/IPv6/TCP/UDP/ICMP/ARP). Adding a protocol no longer requires a new type + tag, JSON round-trips through std json.Unmarshal without out-of-band dispatch, and Parse returns (*Packet, error) so callers can distinguish unknown EtherType from truncated buffers. Layer fields are expanded to mirror gopacket's wire-level coverage; String() now emits in protocol-stack order (ether -> L3 -> L4).
1 parent f25bb8e commit f3aad7d

11 files changed

Lines changed: 1008 additions & 432 deletions

File tree

cmd/dropwatch/format.go

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"io"
2121
"os"
2222

23-
"huatuo-bamai/internal/packet"
2423
"huatuo-bamai/internal/symbol"
2524
"huatuo-bamai/internal/toolstream"
2625
"huatuo-bamai/pkg/types"
@@ -34,8 +33,8 @@ type writer interface {
3433
type textWriter struct{ w io.Writer }
3534

3635
func (s *textWriter) Write(ev *types.DropWatchTracing) error {
37-
if _, err := fmt.Fprintf(s.w, "%s %s %s len=%d dev=%s pid=%d[%s] addr=%s\n",
38-
ev.ObservedTimestamp, ev.PacketType, formatDetail(ev.PacketInfo),
36+
if _, err := fmt.Fprintf(s.w, "%s %s len=%d dev=%s pid=%d[%s] addr=%s\n",
37+
ev.ObservedTimestamp, ev.Layers,
3938
ev.PacketLen, ev.NetdevName, ev.Pid, ev.Comm, ev.PacketSkbAddr); err != nil {
4039
return err
4140
}
@@ -78,12 +77,3 @@ func newWriter(outputFmt string, client *toolstream.Client) writer {
7877
return &textWriter{w: os.Stdout}
7978
}
8079
}
81-
82-
type detailable interface{ Detail() string }
83-
84-
func formatDetail(info packet.PacketInfo) string {
85-
if d, ok := info.(detailable); ok {
86-
return d.Detail()
87-
}
88-
return "[?]"
89-
}

cmd/dropwatch/format_test.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818
"errors"
1919
"testing"
2020

21-
"huatuo-bamai/internal/packet"
2221
"huatuo-bamai/pkg/types"
2322
)
2423

@@ -34,7 +33,6 @@ func TestTextWriterPropagatesIOError(t *testing.T) {
3433

3534
err := w.Write(&types.DropWatchTracing{
3635
ObservedTimestamp: "now",
37-
PacketType: packet.PacketTypeIPv4TCP,
3836
NetdevName: "eth0",
3937
})
4038
if !errors.Is(err, boom) {

cmd/dropwatch/main.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -122,15 +122,18 @@ func deviceFilterConsts(devName string, excluded bool) (map[string]any, error) {
122122
}
123123

124124
func formatEvent(ev *dropPacketEvent) *types.DropWatchTracing {
125-
pkt := packet.PacketHdr{
125+
pkt := packet.Hdr{
126126
EthProto: ev.Raw.EthProto,
127127
RawLen: uint8(ev.Raw.RawLen),
128128
HasEthHdr: uint8(ev.Raw.HasEthHdr),
129129
SkState: uint8(ev.Raw.SkState),
130130
Raw: ev.Raw.Raw,
131131
}
132132

133-
pktType, pktInfo := packet.ParsePacketHdr(&pkt)
133+
p, err := packet.Parse(&pkt)
134+
if err != nil {
135+
log.Debugf("dropwatch: parse packet: %v", err)
136+
}
134137

135138
frames := symbol.KsymStackStrs(ev.Stack[:], symbol.KsymStackMaxDepth)
136139
stackStr := strings.Join(frames, "\n")
@@ -149,8 +152,7 @@ func formatEvent(ev *dropPacketEvent) *types.DropWatchTracing {
149152
PacketSkbAddr: kernaddr.Format(ev.Meta.SkbAddr),
150153
PacketEthProto: fmt.Sprintf("0x%04x", ev.Raw.EthProto),
151154
PacketLen: ev.Raw.PktLen,
152-
PacketType: pktType,
153-
PacketInfo: pktInfo,
155+
Layers: p,
154156
Stack: stackStr,
155157
}
156158
}

core/events/dropwatch.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424

2525
internalconfig "huatuo-bamai/internal/config"
2626
"huatuo-bamai/internal/log"
27-
"huatuo-bamai/internal/packet"
2827
"huatuo-bamai/internal/pod"
2928
"huatuo-bamai/internal/toolstream"
3029
"huatuo-bamai/internal/utils/kernaddr"
@@ -150,7 +149,7 @@ func ignoreDropwatch(data *types.DropWatchTracing) bool {
150149
// 4. tcp_fin/ffffffff963ac200
151150
// 5. ...
152151
// CLOSE_WAIT + skb_rbtree_purge: normal socket teardown, not a drop.
153-
if skState := packet.TCPSkState(data.PacketInfo); skState == "CLOSE_WAIT" {
152+
if data.Layers != nil && data.Layers.TCP != nil && data.Layers.TCP.SkState == "CLOSE_WAIT" {
154153
if len(stack) >= 3 && strings.HasPrefix(stack[2], "skb_rbtree_purge/") {
155154
return true
156155
}

0 commit comments

Comments
 (0)