---
name: "pcap_compile"
section: "3pcap"
platform: "linux"
package: "libpcap"
version: "1.11.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "macos"]
url: "https://new.carta.tech/pcap_compile/3pcap"
---

# pcap\_compile(3pcap)

compile a filter expression

## NAME

pcap\_compile - compile a filter expression

## SYNOPSIS

```
#include <pcap/pcap.h>
```

**int pcap\_compile(pcap\_t \*p, struct bpf\_program \*fp,**\
     **const char \*str, int optimize, bpf\_u\_int32 netmask);**

## DESCRIPTION

**pcap\_compile**() is used to compile the string *str* into a filter program.  See [**pcap-filter**(7)](/pcap-filter/7.md) for the syntax of that string. *fp* is a pointer to a **bpf\_program** structure and is filled in by **pcap\_compile**(). *optimize* controls whether optimization on the resulting code is performed. *netmask* specifies the IPv4 netmask (in host byte order) of the network on which packets are being captured; it is used only when checking for IPv4 broadcast addresses in the filter program.  If the netmask of the network on which packets are being captured isn't known to the program, or if the network interface does not have exactly one IPv4 netmask, or if packets are being captured on the Linux "any" pseudo-interface, which can capture on more than one network interface, a value of **PCAP\_NETMASK\_UNKNOWN** can be supplied; in this case an attempt to compile a filter expression that contains the **ip broadcast** primitive will fail.

On Linux, if the **pcap\_t** handle corresponds to a live packet capture, the resulting filter program may use Linux BPF extensions.  This works transparently if the filter program is used to filter packets on the same **pcap\_t** handle, which should be done when possible.  In other use cases trying to use a filter program with BPF extensions in **pcap\_offline\_filter**(3PCAP) or for filtering an input savefile would reject more packets than expected because the extensions depend on auxiliary packet data, which would not be available.  The workaround is to compile the filter without the extensions by using a **pcap\_t** handle from **pcap\_open\_dead**(3PCAP) or **pcap\_open\_offline**(3PCAP) rather than a handle from **pcap\_create**(3PCAP) or **pcap\_open\_live**(3PCAP).

If BPF extensions are disabled as described above or the OS is not Linux, **pcap\_compile**() may start rejecting some filter expressions for some link-layer header types, this is the expected behaviour.  For example, the **ifindex** keyword is valid for any live capture on Linux, but when reading packets from a savefile, regardless of the OS it is valid for **DLT\_LINUX\_SLL2** only.

By convention, in this function both a null pointer and an empty string are valid arguments for the *str* input parameter and mean the same: to accept all packets.  This should not be confused with an empty resulting filter program: even a program that accepts or rejects all packets comprises at least one BPF instruction, so on success *fp.bf\_insns* is never a null pointer and *fp.bf\_len* is always greater than zero.

## RETURN VALUE

**pcap\_compile**() returns **0** on success and **PCAP\_ERROR** on failure.  If **PCAP\_ERROR** is returned, **pcap\_geterr**(3PCAP) or **pcap\_perror**(3PCAP) may be called with *p* as an argument to fetch or display the error text.

## BACKWARD COMPATIBILITY

The **PCAP\_NETMASK\_UNKNOWN** constant became available in libpcap release 1.1.0.

In libpcap 1.8.0 and later, **pcap\_compile**() can be used in multiple threads within a single process.  However, in earlier versions of libpcap, it is *not* safe to use **pcap\_compile**() in multiple threads in a single process without some form of mutual exclusion allowing only one thread to call it at any given time.

## SEE ALSO

**pcap**(3PCAP), **pcap\_setfilter**(3PCAP), **pcap\_freecode**(3PCAP)
