func()

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)
					}
				}
			}

		}
	}
}