in pcap-cli/internal/transformer/json_translator.go [625:683]
func (t *JSONPcapTranslator) addTCPoptions(
ctx context.Context,
tcp *layers.TCP,
L4 *gabs.Container,
) {
opts, _ := L4.ArrayOfSize(len(tcp.Options), "opts")
for i, tcpOpt := range tcp.Options {
// see: https://github.com/google/gopacket/blob/master/layers/tcp.go#L104C9-L128
if o := tcpOptionRgx.FindStringSubmatch(tcpOpt.String()); o != nil {
tcpOptVal := strings.TrimSpace(o[2])
if tcpOptVal == "" {
opts.SetIndex(o[1], i)
continue
}
opt, _ := opts.ObjectI(i)
optKey := strings.TrimSpace(o[1])
optVals := strings.Split(tcpOptVal, " ")
opt.Array(optKey)
for _, optVal := range optVals {
optVal = strings.TrimSpace(optVal)
// see: https://github.com/google/gopacket/blob/master/layers/tcp.go#L37-L57
// [ToDo] – handle: SACK
if optVal == "" {
continue
} else if strings.HasPrefix(optVal, "0x") {
optHexVal := strings.TrimRight(optVal, "0")
switch tcpOpt.OptionType {
case 3: // WindowScale
t.addTCPwindowScale(ctx, tcp, &optKey, &optHexVal, opt, L4)
default:
opt.ArrayAppend(optHexVal, optKey)
}
} else {
switch tcpOpt.OptionType {
case 8: // Timestamps
atDebugVerbosity(ctx,
t.pcapTranslator,
func(
ctx context.Context,
translator *pcapTranslator,
) {
for _, ts := range strings.Split(optVal, "/") {
opt.ArrayAppend(strings.TrimSpace(ts), optKey)
}
})
default:
opt.ArrayAppend(optVal, optKey)
}
}
}
}
}
}