Skip to content

Commit c73b7ad

Browse files
authored
Fix decode TCP flags with u32 (#968)
* Fix decode TCP flags with u32 Fixes #946 * new uint conversion func * simplify test
1 parent 18e4ebd commit c73b7ad

File tree

4 files changed

+56
-3
lines changed

4 files changed

+56
-3
lines changed

pkg/pipeline/transform/transform_network.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ func (n *Network) Transform(inputEntry config.GenericMap) (config.GenericMap, bo
139139
}
140140
case api.NetworkDecodeTCPFlags:
141141
if anyFlags, ok := outputEntry[rule.DecodeTCPFlags.Input]; ok && anyFlags != nil {
142-
if flags, ok := anyFlags.(uint16); ok {
142+
if flags, err := util.ConvertToUint(anyFlags); err == nil {
143143
flags := util.DecodeTCPFlags(flags)
144144
outputEntry[rule.DecodeTCPFlags.Output] = flags
145145
}

pkg/pipeline/transform/transform_network_test.go

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,3 +543,41 @@ func Test_ValidateReinterpretDirection(t *testing.T) {
543543
"FlowDirection": 1,
544544
}, output)
545545
}
546+
547+
func Test_DecodeTCPFlags(t *testing.T) {
548+
tr, err := NewTransformNetwork(config.StageParam{
549+
Transform: &config.Transform{
550+
Network: &api.TransformNetwork{
551+
Rules: []api.NetworkTransformRule{
552+
{
553+
Type: "decode_tcp_flags",
554+
DecodeTCPFlags: &api.NetworkGenericRule{
555+
Input: "TcpFlagsU16",
556+
Output: "TcpFlagsU16String",
557+
},
558+
},
559+
{
560+
Type: "decode_tcp_flags",
561+
DecodeTCPFlags: &api.NetworkGenericRule{
562+
Input: "TcpFlagsU32",
563+
Output: "TcpFlagsU32String",
564+
},
565+
},
566+
},
567+
},
568+
},
569+
}, nil)
570+
require.NoError(t, err)
571+
572+
output, ok := tr.Transform(config.GenericMap{
573+
"TcpFlagsU16": uint16(17),
574+
"TcpFlagsU32": uint32(18),
575+
})
576+
require.True(t, ok)
577+
require.Equal(t, config.GenericMap{
578+
"TcpFlagsU16": uint16(17),
579+
"TcpFlagsU16String": []string{"FIN", "ACK"},
580+
"TcpFlagsU32": uint32(18),
581+
"TcpFlagsU32String": []string{"SYN", "ACK"},
582+
}, output)
583+
}

pkg/utils/convert.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,21 @@ func ConvertToInt(unk interface{}) (int, error) {
217217
}
218218
}
219219

220+
func ConvertToUint(unk interface{}) (uint, error) {
221+
switch i := unk.(type) {
222+
case uint64:
223+
return uint(i), nil
224+
case uint32:
225+
return uint(i), nil
226+
case uint16:
227+
return uint(i), nil
228+
case uint:
229+
return uint(i), nil
230+
default:
231+
return 0, fmt.Errorf("can't convert %v to uint", i)
232+
}
233+
}
234+
220235
func ConvertToBool(unk interface{}) (bool, error) {
221236
switch i := unk.(type) {
222237
case string:

pkg/utils/tcp_flags.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package utils
22

33
type tcpFlag struct {
4-
value uint16
4+
value uint
55
name string
66
}
77

@@ -19,7 +19,7 @@ var tcpFlags = []tcpFlag{
1919
{value: 1024, name: "RST_ACK"},
2020
}
2121

22-
func DecodeTCPFlags(bitfield uint16) []string {
22+
func DecodeTCPFlags(bitfield uint) []string {
2323
var values []string
2424
for _, flag := range tcpFlags {
2525
if bitfield&flag.value != 0 {

0 commit comments

Comments
 (0)