Push PCAP is a function on the FMADIO device which can filter / split / compress the raw incoming packet data. FMADIO systems will always write to the SSD Storage first, this prevents any packet loss on capture. Once on storage it is then read out and processed by the Push PCAP code.
For example use case
https://www.fmad.io/blog/push-compressed-realtime-filtered-pcap
FMADIO Push PCAP Architecture
.png?sv=2026-02-06&spr=https&st=2026-08-01T20%3A26%3A09Z&se=2026-08-01T20%3A39%3A09Z&sr=c&sp=r&sig=%2B2iE%2FS9kP%2FXg%2FRCRutRxhl7tGWaSrMPB8TRg%2Fn%2Bs6o4%3D)
Process flow
1) FMADIO Capture
FMADIO Capture device uses the FPGA and SSD Capture buffer to write packets revived on the Capture Ports directly to the SSDs. This path has minimial filtering and processing, with the goal of capturing everything first, ask questions later.
2) FMADIO Push PCAP
Once data is in the Capture Buffer, the builtin FMADIO Push PCAP function reads from the SSD buffer (1TB - 1PB) where it splits and filters using BPF Filters and optionally compresses the data, before writing it to the Local Scratch disk which is a normal linux EXT4 or XFS based storage system.
3) FMADIO Push PCAP Post Processing
After PCAPs have been generated on the local Scratch Disk, various post processing can be performed. Below are examples of features that are built into the FMADIO system
- Remote Copy
In addition to writing to the local disk, the system can copy the PCAP files from the local disk to a remote storage, such as AWS S3 or GCP S3 or Other S3 buckets. This copy process includes checks once completed the file sizes match providing additional layers of monitoring data has arrived at the remote location.
- Market Data Gap Detection
Once PCAPs have been generated on the Local Scratch Disk, additional processing can be performed to confirm all market data has been recevied (e.g. no gaps in the data). This provides an additional verification step in the pipeline enabling further quality checks of the generated PCAP data.
Supported Hardware
Hardware | Push PCAP Intraday | Push PCAP End of Day | Min. firmware version | Notes |
|---|---|---|---|---|
FMADIO-3114 | 6979 | |||
FMADIO-3214 | 6979 | |||
FMADIO-3414 | 6979 | |||
FMADIO-3514 | 6979 | |||
FMADIO-5114 | 6979 | |||
FMADIO-5214 | 6979 | |||
FMADIO-5414 | 6979 | |||
FMADIO-5514 | 6979 |
Supported Endpoints
The primary endpoint is an S3 bucket, this could be an AWS S3 bucket, GCP S3 bucket or MiniIO S3 Bucket as typical end use cases.
Mode | Description |
|---|---|
linux file | linux file on FMADIO capture system |
NFS | remote NFS mountpoint on FMADIO capture system |
SFTP | remote SSH file system via rclone ( https://rclone.org/sftp/ ) |
FTP | FTP push via rclone ( https://rclone.org/ftp/ ) |
S3 | S3 protocol via rclone ( https://rclone.org/s3/ ) |
Google Drive | Google drive via rclone ( https://rclone.org/drive/ ) |
Digital Ocean | Digital Ocean Spaces via rclone ( https://rclone.org/s3/#digitalocean-spaces ) |
Azure Blob | Microsoft Azure Blob via rclone ( https://rclone.org/azureblob/ ) |
Dropbox | Dropbox via rclone ( https://rclone.org/dropbox/ ) |
Hadoop HDFS | Hadoop file system via rclone ( https://rclone.org/hdfs/ ) |
Ceph | Ceph S3 interface via rclone ( https://rclone.org/s3/ ) |
and many more, see the rclone documentation for full list of endpoints supported: https://rclone.org/docs/
Configuration
Configuration is via configuration scripts located at:
/opt/fmadio/etc/push_pcap.luaIf there is no such file above, please copy the basic example from the following location:
/opt/fmadio/etc_ro/push_pcap.lua.basicAn example is shown as follows:
local Config = {}
Config.TimeoutRing = 5*60e9
Config.Target = {}
table.insert(Config.Target,
{
Desc = "Full",
Mode = "File",
Path = os.date("/mnt/remote0/pcap/%Y%m%d/all-", PCAPTS),
Split = "--split-time "..(60*60*1e9),
SplitCmd = "-Z fmadio",
FileName = "--filename-tstr-HHMMSS",
FilterBPF = "",
PipeCmd = "zstd -c -T8",
FileSuffix= ".pcap.zstd",
})
table.insert(Config.Target,
{
Desc = "tcp_192_168_1_0",
Mode = "File",
Path = os.date("/mnt/remote0/pcap/%Y%m%d/tcp_host-", PCAPTS),
Split = "--split-time "..(60*60*1e9),
SplitCmd = "-Z fmadio",
FileName = "--filename-tstr-HHMMSS",Multiple Push PCAP targets can be specified, there is no real limit however throughput of processing may be impacted.
In the above example there are 2 Push PCAP rules:
A) Push all packet data (no filter)
This Push PCAP target sends all PCAP data the remote NFS share mounted on:
/mnt/remote0See Mount Remote NFS (Linux) Drive for details on setting up /mnt/remote0 mounting points.
The specified is "FilterBPF=nil" meaning there is no filter, thus all traffic is pushed
B) Push all TCP data from network 192.168.1.0/24
The second example shows pushing all TCP data on the network 192.168.1.0/24 to the specified /mnt/remote0/push/ directory with a PCAP file prefix of "tcp_*"
Note:
FilterBPF=net 192.168.1.0/24 and tcp This applies a full BPF (Berkley Packet Filter https://en.wikipedia.org/wiki/Berkeley_Packet_Filter ) with the filter "tcp" on the packets before writing it to the location. This results in only TCP data written to the /mnt/remote0/push/tcp_*.pcap output files.