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
}