Skip to content

Commit 24f358e

Browse files
committed
Fix decode TCP flags with u32
Fixes #946
1 parent 8ded3b0 commit 24f358e

File tree

4 files changed

+68
-19
lines changed

4 files changed

+68
-19
lines changed

pkg/pipeline/transform/transform_network.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,10 @@ func (n *Network) Transform(inputEntry config.GenericMap) (config.GenericMap, bo
144144
case api.NetworkDecodeTCPFlags:
145145
if anyFlags, ok := outputEntry[rule.DecodeTCPFlags.Input]; ok && anyFlags != nil {
146146
if flags, ok := anyFlags.(uint16); ok {
147-
flags := util.DecodeTCPFlags(flags)
147+
flags := util.DecodeTCPFlagsU16(flags)
148+
outputEntry[rule.DecodeTCPFlags.Output] = flags
149+
} else if flags, ok := anyFlags.(uint32); ok {
150+
flags := util.DecodeTCPFlagsU32(flags)
148151
outputEntry[rule.DecodeTCPFlags.Output] = flags
149152
}
150153
}

pkg/pipeline/transform/transform_network_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -521,3 +521,38 @@ func Test_ValidateReinterpretDirection(t *testing.T) {
521521
"FlowDirection": 1,
522522
}, output)
523523
}
524+
525+
func Test_DecodeTCPFlags(t *testing.T) {
526+
tr, err := NewTransformNetwork(config.StageParam{
527+
Transform: &config.Transform{
528+
Network: &api.TransformNetwork{
529+
Rules: []api.NetworkTransformRule{{
530+
Type: "decode_tcp_flags",
531+
DecodeTCPFlags: &api.NetworkGenericRule{
532+
Input: "TcpFlags",
533+
Output: "TcpFlagsString",
534+
},
535+
}},
536+
},
537+
},
538+
}, nil)
539+
require.NoError(t, err)
540+
541+
output, ok := tr.Transform(config.GenericMap{
542+
"TcpFlags": uint16(17),
543+
})
544+
require.True(t, ok)
545+
require.Equal(t, config.GenericMap{
546+
"TcpFlags": uint16(17),
547+
"TcpFlagsString": []string{"FIN", "ACK"},
548+
}, output)
549+
550+
output, ok = tr.Transform(config.GenericMap{
551+
"TcpFlags": uint32(17),
552+
})
553+
require.True(t, ok)
554+
require.Equal(t, config.GenericMap{
555+
"TcpFlags": uint32(17),
556+
"TcpFlagsString": []string{"FIN", "ACK"},
557+
}, output)
558+
}

pkg/utils/tcp_flags.go

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,39 @@
11
package utils
22

33
type tcpFlag struct {
4-
value uint16
5-
name string
4+
value16 uint16
5+
value32 uint32
6+
name string
67
}
78

89
var tcpFlags = []tcpFlag{
9-
{value: 1, name: "FIN"},
10-
{value: 2, name: "SYN"},
11-
{value: 4, name: "RST"},
12-
{value: 8, name: "PSH"},
13-
{value: 16, name: "ACK"},
14-
{value: 32, name: "URG"},
15-
{value: 64, name: "ECE"},
16-
{value: 128, name: "CWR"},
17-
{value: 256, name: "SYN_ACK"},
18-
{value: 512, name: "FIN_ACK"},
19-
{value: 1024, name: "RST_ACK"},
10+
{value16: 1, value32: 1, name: "FIN"},
11+
{value16: 2, value32: 2, name: "SYN"},
12+
{value16: 4, value32: 4, name: "RST"},
13+
{value16: 8, value32: 8, name: "PSH"},
14+
{value16: 16, value32: 16, name: "ACK"},
15+
{value16: 32, value32: 32, name: "URG"},
16+
{value16: 64, value32: 64, name: "ECE"},
17+
{value16: 128, value32: 128, name: "CWR"},
18+
{value16: 256, value32: 256, name: "SYN_ACK"},
19+
{value16: 512, value32: 512, name: "FIN_ACK"},
20+
{value16: 1024, value32: 1024, name: "RST_ACK"},
2021
}
2122

22-
func DecodeTCPFlags(bitfield uint16) []string {
23+
func DecodeTCPFlagsU16(bitfield uint16) []string {
2324
var values []string
2425
for _, flag := range tcpFlags {
25-
if bitfield&flag.value != 0 {
26+
if bitfield&flag.value16 != 0 {
27+
values = append(values, flag.name)
28+
}
29+
}
30+
return values
31+
}
32+
33+
func DecodeTCPFlagsU32(bitfield uint32) []string {
34+
var values []string
35+
for _, flag := range tcpFlags {
36+
if bitfield&flag.value32 != 0 {
2637
values = append(values, flag.name)
2738
}
2839
}

pkg/utils/tcp_flags_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,12 @@ import (
77
)
88

99
func TestDecodeFlags(t *testing.T) {
10-
flags528 := DecodeTCPFlags(528)
10+
flags528 := DecodeTCPFlagsU16(528)
1111
assert.Equal(t, []string{"ACK", "FIN_ACK"}, flags528)
1212

13-
flags256 := DecodeTCPFlags(256)
13+
flags256 := DecodeTCPFlagsU32(256)
1414
assert.Equal(t, []string{"SYN_ACK"}, flags256)
1515

16-
flags666 := DecodeTCPFlags(666)
16+
flags666 := DecodeTCPFlagsU16(666)
1717
assert.Equal(t, []string{"SYN", "PSH", "ACK", "CWR", "FIN_ACK"}, flags666)
1818
}

0 commit comments

Comments
 (0)