Cycle every payload pattern per packet and always run both directions

This commit is contained in:
flamingcow
2026-07-25 23:03:31 -07:00
parent 0f16edfe61
commit e77574712d
8 changed files with 75 additions and 104 deletions
+23 -24
View File
@@ -2,7 +2,6 @@ package main
import (
"encoding/binary"
"fmt"
"hash/crc32"
"math/rand/v2"
)
@@ -61,60 +60,60 @@ var patterns = []pattern{
}},
}
func patternIndex(name string) (int, error) {
for i, p := range patterns {
if p.name == name {
return i, nil
}
}
func patternNames() []string {
names := make([]string, len(patterns))
for i, p := range patterns {
names[i] = p.name
}
return 0, fmt.Errorf("unknown pattern %q (have %v)", name, names)
return names
}
// Every pattern is laid out at full length up front with its checksum at each
// size, so a sender picks a pattern by choosing a buffer, never by writing one.
type frameSpec struct {
patIdx int
ref []byte
crcFor map[int]uint32
refs [][]byte
crcFor []map[int]uint32
dstMAC [6]byte
srcMAC [6]byte
etherType uint16
sizes []int
maxSize int
maxPay int
}
func newFrameSpec(patIdx int, dst, src [6]byte, etherType uint16, sizes []int) *frameSpec {
func newFrameSpec(dst, src [6]byte, etherType uint16, sizes []int) *frameSpec {
maxSize := 0
for _, s := range sizes {
if s > maxSize {
maxSize = s
}
}
ref := make([]byte, maxSize-minFrame)
patterns[patIdx].fill(ref)
crcFor := make(map[int]uint32, len(sizes))
for _, s := range sizes {
crcFor[s] = crc32.Checksum(ref[:s-minFrame], crcTable)
}
return &frameSpec{
patIdx: patIdx,
ref: ref,
crcFor: crcFor,
f := &frameSpec{
dstMAC: dst,
srcMAC: src,
etherType: etherType,
sizes: sizes,
maxSize: maxSize,
maxPay: maxSize - minFrame,
}
for _, p := range patterns {
ref := make([]byte, f.maxPay)
p.fill(ref)
crcFor := make(map[int]uint32, len(sizes))
for _, s := range sizes {
crcFor[s] = crc32.Checksum(ref[:s-minFrame], crcTable)
}
f.refs = append(f.refs, ref)
f.crcFor = append(f.crcFor, crcFor)
}
return f
}
func (f *frameSpec) prefill(buf []byte) {
func (f *frameSpec) prefill(buf []byte, patIdx int) {
copy(buf[0:6], f.dstMAC[:])
copy(buf[6:12], f.srcMAC[:])
binary.BigEndian.PutUint16(buf[12:14], f.etherType)
copy(buf[minFrame:], f.ref)
copy(buf[minFrame:], f.refs[patIdx])
}
func putHeader(buf []byte, patIdx int, stream uint16, seq uint64, payLen int, crc uint32) {