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
}