mirror of
https://github.com/soypat/lneto.git
synced 2026-08-21 15:09:05 +00:00
fix TCP flags not being extracted from capture correctly
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
package pcap
|
||||
|
||||
import (
|
||||
"math"
|
||||
"math/rand"
|
||||
"testing"
|
||||
|
||||
"github.com/soypat/lneto"
|
||||
"github.com/soypat/lneto/ethernet"
|
||||
"github.com/soypat/lneto/http/httpraw"
|
||||
"github.com/soypat/lneto/internal/ltesto"
|
||||
"github.com/soypat/lneto/ipv4"
|
||||
"github.com/soypat/lneto/tcp"
|
||||
)
|
||||
|
||||
func TestCap(t *testing.T) {
|
||||
const mtu = 1500
|
||||
var buf [mtu]byte
|
||||
var gen ltesto.PacketGen
|
||||
rng := rand.New(rand.NewSource(1))
|
||||
gen.RandomizeAddrs(rng)
|
||||
pkt := gen.AppendRandomIPv4TCPPacket(buf[:0], rng, tcp.Segment{
|
||||
SEQ: 100,
|
||||
ACK: 200,
|
||||
DATALEN: 256,
|
||||
WND: 1024,
|
||||
Flags: tcp.FlagFIN, //tcp.FlagSYN | tcp.FlagACK | tcp.FlagPSH,
|
||||
})
|
||||
var hdr httpraw.Header
|
||||
hdr.SetStatus("200", "OK")
|
||||
hdr.Set("Cookie", "ABC=123")
|
||||
var pbreak PacketBreakdown
|
||||
frames, err := pbreak.CaptureEthernet(nil, pkt, 0)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
// Ethernet+IPv4+TCP+HTTP = 4 frames
|
||||
if len(frames) != 4 {
|
||||
t.Errorf("want 4 frames, got %d", len(frames))
|
||||
}
|
||||
getClass := func(frame Frame, class FieldClass) uint64 {
|
||||
idx, err := frame.FieldByClass(class)
|
||||
if err != nil {
|
||||
return 0xffff_ffff_ffff_ffff
|
||||
}
|
||||
v, _ := frame.FieldAsUint(idx, pkt)
|
||||
return v
|
||||
}
|
||||
getName := func(frame Frame, name string) uint64 {
|
||||
for i := range frame.Fields {
|
||||
if frame.Fields[i].Name == name {
|
||||
v, _ := frame.FieldAsUint(i, pkt)
|
||||
return v
|
||||
}
|
||||
}
|
||||
return math.MaxUint64
|
||||
}
|
||||
efrm, _ := ethernet.NewFrame(pkt)
|
||||
pefrm := frames[0]
|
||||
pifrm := frames[1]
|
||||
ptfrm := frames[2]
|
||||
// phfrm := frames[3]
|
||||
gotEproto := ethernet.Type(getClass(pefrm, FieldClassProto))
|
||||
if gotEproto != efrm.EtherTypeOrSize() {
|
||||
t.Errorf("want %s ethernet type, got %s", efrm.EtherTypeOrSize().String(), gotEproto.String())
|
||||
}
|
||||
|
||||
ifrm, _ := ipv4.NewFrame(efrm.Payload())
|
||||
gotIproto := lneto.IPProto(getClass(pifrm, FieldClassProto))
|
||||
if gotIproto != ifrm.Protocol() {
|
||||
t.Errorf("want %s IP proto, got %s", ifrm.Protocol().String(), gotIproto.String())
|
||||
}
|
||||
gotToS := ipv4.ToS(getName(pifrm, "Type of Service"))
|
||||
wantToS := ifrm.ToS()
|
||||
if gotToS != wantToS {
|
||||
t.Errorf("want %x IP ToS, got %x", wantToS, gotToS)
|
||||
}
|
||||
gotIflags := ipv4.Flags(getClass(pifrm, FieldClassFlags))
|
||||
if gotIflags != ifrm.Flags() {
|
||||
t.Errorf("want %x IP flags, got %x", ifrm.Flags(), gotIflags)
|
||||
}
|
||||
gotVersion := getClass(pifrm, FieldClassVersion)
|
||||
wantVersion, _ := ifrm.VersionAndIHL()
|
||||
if gotVersion != uint64(wantVersion) {
|
||||
t.Errorf("want %d IP version, got %d", wantVersion, gotVersion)
|
||||
}
|
||||
|
||||
tfrm, _ := tcp.NewFrame(ifrm.Payload())
|
||||
gotTCPFlags := tcp.Flags(getClass(ptfrm, FieldClassFlags))
|
||||
wantHeaderLen, wantTCPflags := tfrm.OffsetAndFlags()
|
||||
if gotTCPFlags != wantTCPflags {
|
||||
t.Errorf("want %s TCP flags, got %s", wantTCPflags.String(), gotTCPFlags.String())
|
||||
}
|
||||
gotHeaderLen := getClass(ptfrm, FieldClassSize)
|
||||
if gotHeaderLen != uint64(wantHeaderLen) {
|
||||
t.Errorf("want %d TCP header length, got %d", wantHeaderLen, gotHeaderLen)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user