Cycle every payload pattern per packet and always run both directions
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user