func()

in tcpdumpw/pkg/filter/l4_proto_filter_provider.go [41:84]


func (p *L4ProtoFilterProvider) Get(ctx context.Context) (*string, bool) {
	if *p.Raw == "" ||
		*p.Raw == "23" || // tcp(6) + udp(17)
		*p.Raw == "0x17" || // tcp(0x06) + udp(0x11)
		strings.EqualFold(*p.Raw, "ALL") ||
		strings.EqualFold(*p.Raw, "ANY") ||
		strings.EqualFold(*p.Raw, l4_PROTO_DEFAULT_FILTER) {
		filter := string(l4_PROTO_DEFAULT_FILTER)
		return &filter, true
	}

	protos := strings.Split(*p.Raw, ",")
	if len(protos) == 0 || (len(protos) == 1 && protos[0] == "") {
		filter := string(l4_PROTO_DEFAULT_FILTER)
		return &filter, true
	}

	l4Protos := mapset.NewThreadUnsafeSet[string]()

	for _, proto := range protos {
		switch proto {
		case "tcp", "6", "0x06":
			l4Protos.Add(string(l4_PROTO_TCP_FILTER))
			p.AddL4Proto(pcap.L4_PROTO_TCP)
		case "udp", "17", "0x11":
			l4Protos.Add(string(l4_PROTO_UDP_FILTER))
			p.AddL4Proto(pcap.L4_PROTO_UDP)
		case "icmp", "icmp4", "1", "0x01":
			l4Protos.Add(string(l4_PROTO_ICMPv4_FILTER))
			p.AddL4Proto(pcap.L4_PROTO_ICMP)
		case "icmp6", "58", "0x3A":
			l4Protos.Add(string(l4_PROTO_ICMPv6_FILTER))
			p.AddL4Proto(pcap.L4_PROTO_ICMP6)
		}
	}

	if l4Protos.IsEmpty() {
		filter := string(l4_PROTO_DEFAULT_FILTER)
		return &filter, true
	}

	filter := stringFormatter.Format("{0}", strings.Join(l4Protos.ToSlice(), " or "))
	return &filter, true
}