func()

in tcpdumpw/pkg/filter/tcp_flags_filter_provider.go [34:72]


func (p *TCPFlagsFilterProvider) Get(ctx context.Context) (*string, bool) {
	if *p.Raw == "" ||
		strings.EqualFold(*p.Raw, "ALL") ||
		strings.EqualFold(*p.Raw, "ANY") {
		return nil, false
	}

	flags := strings.Split(strings.ToLower(*p.Raw), ",")
	if len(flags) == 0 || (len(flags) == 1 && flags[0] == "") {
		return nil, false
	}

	flagsSet := mapset.NewThreadUnsafeSet(flags...)

	var setFlags uint8 = 0
	flagsSet.Each(func(flagStr string) bool {
		flagStr = strings.ToUpper(flagStr)
		tcpFlag := pcap.TCPFlag(flagStr)
		if flag := tcpFlag.ToUint8(); flag == 0 {
			flagsSet.Remove(flagStr)
		} else {
			setFlags |= flag
			p.AddTCPFlags(tcpFlag)
		}
		return false // do not stop iteration
	})

	if setFlags == 0 || flagsSet.IsEmpty() {
		return nil, false
	}

	ip6Filter := stringFormatter.Format("ip6[13+40]&0x{0}!=0", strconv.FormatUint(uint64(setFlags), 16))
	// OR'ing out all the TCP flags: if any of the flags is set, packet will be captured
	ip4Filter := stringFormatter.Format("tcp-{0}", strings.Join(flagsSet.ToSlice(), "|tcp-"))
	// bitwise intersection should not yield 0, so intersection must not be empty
	filter := stringFormatter.Format("(tcp[tcpflags]&({0})!=0) or ({1})", ip4Filter, ip6Filter)

	return &filter, true
}