func()

in tcpdumpw/pkg/filter/ip_filter_provider.go [87:145]


func (p *IPFilterProvider) Get(ctx context.Context) (*string, bool) {
	if *p.ipv4Filter.Raw == "" &&
		*p.ipv6Filter.Raw == "" &&
		*p.dnsFilterProvider.Raw == "" {
		return nil, false
	}

	IPs, NETs := p.getIPsAndNETs(ctx)
	ipSet := mapset.NewThreadUnsafeSet(IPs...)
	if IPs, ok := p.dnsFilterProvider.hostsToIPs(ctx); ok && !IPs.IsEmpty() {
		ipSet.Append(IPs.ToSlice()...)
	}

	for _, net := range NETs {
		NET, _ := netip.ParsePrefix(net)
		// this is potentially very slow/expensive: O(IP^NET)
		// we prefer to pay the price only once here,
		// instead of having a complex/slow BPF filter.
		ipSet.Each(func(ip string) bool {
			IP, _ := netip.ParseAddr(ip)
			if NET.Contains(IP) {
				// if any NET already contains this IP,
				// then keep the NET and drop the IP.
				ipSet.Remove(ip)
			} else if IP.Is4() {
				p.compatFilters.AddIPv4s(ip)
			} else if IP.Is6() {
				p.compatFilters.AddIPv6s(ip)
			}
			return false
		})
	}
	netSet := mapset.NewThreadUnsafeSet(NETs...)

	ipFilter := ""
	if !ipSet.IsEmpty() {
		ipFilter = stringFormatter.Format("host {0}",
			strings.Join(ipSet.ToSlice(), " or host "))
	}

	netFilter := ""
	if !netSet.IsEmpty() {
		netFilter = stringFormatter.Format("net {0}",
			strings.Join(netSet.ToSlice(), " or net "))
	}

	filter := ""
	if ipFilter != "" && netFilter != "" {
		filter = stringFormatter.Format("({0}) or ({1})", ipFilter, netFilter)
	} else if ipFilter != "" {
		filter = ipFilter
	} else if netFilter != "" {
		filter = netFilter
	} else {
		filter = string(defaultIPfilter)
	}

	return &filter, true
}