feat(03-01): extend TrafficClass to 14 classes with hash-bucketed unknowns
- Replace ClassUnknown with ClassUnknown1-4 (unknown-1 through unknown-4) - AllClasses() now returns 14 elements - Add hashBucket() function routing unrecognized traffic deterministically - Update synth/config.go: NumLayers=14, 4 dissonant unknown tone configs at 862-1047 Hz - Add TestAllClassesCount and TestHashBucketDistribution tests - Add TestClassFreqConfigsComplete and TestNumLayersMatchesAllClasses to config_test.go - Update TestNewBankHas14Layers, TestMixerNoClip for 14 classes - All classify and synth tests pass
This commit is contained in:
+32
-3
@@ -17,10 +17,9 @@ func NewClassifier(rules []Rule) *Classifier {
|
||||
|
||||
// Classify inspects a gopacket.Packet and returns a ClassifiedPacket.
|
||||
// It checks ICMP first, then extracts TCP/UDP port info and matches against rules.
|
||||
// Per D-03: returns ClassUnknown if no rule matches.
|
||||
// Per D-03: returns ClassUnknown1-4 via hash-bucketing if no rule matches.
|
||||
func (c *Classifier) Classify(pkt gopacket.Packet) ClassifiedPacket {
|
||||
result := ClassifiedPacket{
|
||||
Class: ClassUnknown,
|
||||
Length: len(pkt.Data()),
|
||||
}
|
||||
|
||||
@@ -34,6 +33,7 @@ func (c *Classifier) Classify(pkt gopacket.Packet) ClassifiedPacket {
|
||||
return result
|
||||
}
|
||||
}
|
||||
result.Class = hashBucket(result.DstPort, result.Protocol)
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -49,6 +49,7 @@ func (c *Classifier) Classify(pkt gopacket.Packet) ClassifiedPacket {
|
||||
return result
|
||||
}
|
||||
}
|
||||
result.Class = hashBucket(result.DstPort, result.Protocol)
|
||||
return result
|
||||
}
|
||||
|
||||
@@ -64,9 +65,37 @@ func (c *Classifier) Classify(pkt gopacket.Packet) ClassifiedPacket {
|
||||
return result
|
||||
}
|
||||
}
|
||||
result.Class = hashBucket(result.DstPort, result.Protocol)
|
||||
return result
|
||||
}
|
||||
|
||||
// No recognized transport layer -> ClassUnknown per D-03
|
||||
// No recognized transport layer -> hash-bucket per D-03
|
||||
result.Class = hashBucket(result.DstPort, result.Protocol)
|
||||
return result
|
||||
}
|
||||
|
||||
// hashBucket maps an unrecognized packet to one of 4 unknown traffic classes.
|
||||
// Deterministic: same (dstPort, protocol) always maps to the same bucket.
|
||||
// ARP and other non-transport packets have dstPort=0, protocol="" -> bucket 0 (ClassUnknown1).
|
||||
func hashBucket(dstPort uint16, protocol string) TrafficClass {
|
||||
var protoNum uint16
|
||||
switch protocol {
|
||||
case "tcp":
|
||||
protoNum = 6
|
||||
case "udp":
|
||||
protoNum = 17
|
||||
case "icmp":
|
||||
protoNum = 1
|
||||
}
|
||||
h := uint32(dstPort)*31 + uint32(protoNum)*7
|
||||
switch h % 4 {
|
||||
case 0:
|
||||
return ClassUnknown1
|
||||
case 1:
|
||||
return ClassUnknown2
|
||||
case 2:
|
||||
return ClassUnknown3
|
||||
default:
|
||||
return ClassUnknown4
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user