> I would like to implement an IP address range filter similar to the
> BPF capture filter that takes an IP address and subnet mask (like in
> "net 192.168.0.0 and mask 255.255.255.0"). What would be the best way
> to calculate this in C? Or in which file can I find the BPF
> implementation of this expression?

Ok, pretty straightforward using the CIDR notation:

bool in_cidr_subnet(unsigned long ip_addr,
   unsigned long cidr_network_addr,
   unsigned short cidr_bits)
{
   const unsigned long mask = ntohl(((unsigned long) -1) << (32-cidr_bits));
   assert(cidr_network_addr & mask == cidr_network_addr);
   const unsigned long ip_network_addr = ip_addr & mask;
   return cidr_network_addr == ip_network_addr;
}
-
This is the tcpdump-workers list.
Visit https://cod.sandelman.ca/ to unsubscribe.

Reply via email to