As part of our testing and system verification, FMADIO has a full FMADIO-5514-180T system deployed into NY2 receiving the full OPRA feed over 2 ×100G Cross connects from NY4. This system provides us with valuable real-world semi-PROD environment we can experiment and test our solution on.
Version 2
The configuration we have setup is shown below:
.png?sv=2022-11-02&spr=https&st=2025-12-20T21%3A21%3A52Z&se=2025-12-20T21%3A33%3A52Z&sr=c&sp=r&sig=wzu2q7WVEIV%2FVaSQ4cpDB5KKcQdA8A9haGj%2FfxKdGYE%3D)
In the above example the system is splitting the OPRA A feed into a single 1Min PCAP per each Multicast group. This results in:
Every 1 minute
For each Multicast group
A generated PCAP file on the local scratch disk.
The location of this config is:
/opt/fmadio/etc/push_pcap.luaThe actual config file:
local Config = {}
-- start processing from the start of the capture (instead of current write position)
Config.FollowStart = false
-- do not de-encapsulate the packets
Config.Decap = false
Config.Target = {}
-- for each of the 96 OPRA Multicast groups
for MCGroup=1,96 do
-- generate a PCAP output
table.insert(Config.Target,
{
Mode = "File",
-- unique name for each split
Desc = string.format("pcap-all-capture0-opra-%02i", MCGroup),
-- promethues lablel for each metric
Promethues= string.format('port="capture0",feed="A",group="%02i"', MCGroup),
-- write location on the local disk
Path = string.format("/mnt/store1/pcap/capture0/opra-%02i-", MCGroup),
-- copy location (e.g. remote S3 mount point)
Copy = string.format("/mnt/remote0/copy/capture0/opra-%02i-", MCGroup),
-- split every 1min / 60 seconds
Split = "--split-time 60e9 ",
-- filename format is epoch time
FileName = "--filename-epoch-sec-startend",
-- BPF filter to select only the OPRA A feed destination multicast group
FilterBPF = "ip and dst host 224.0.204."..MCGroup,
-- optional additional (disabled)
--PipeCmd = "zstd -c -T8",
--FileSuffix = ".pcap.zst",
--Post = "/opt/fmadio/analytics/push_pcap_copy.lua",
})
end
return ConfigThe above config general keeps running in pseudo-realtime during the day. During busier periods there are some delays at market open, which get quickly caught up within the first hour. Capture is not impacted during this period.
IGMP Joins
In addition to capturing the FMADIO systems can issue IGMP joins from the capture interfaces itself. This allows the FMADIO device to subscribe to multicast groups (e.g. market data) directly without requiring a 3rd system or static joins on the switch.
For OPRA the following is the configuration file require. This is located in
/opt/fmadio/etc/igmp.luaJoining all 96 Multicast groups x2 (one per Feed per capture port) shown below.
local Port0 = {}
for i=1,96 do
table.insert(Port0, { Group = "224.0.204."..i, Port = 45000 + i, VLAN = nil }) -- "OPRA_001",
end
local Port1 = {}
for i=1,96 do
table.insert(Port1, { Group = "224.0.206."..i, Port = 45000 + i, VLAN = nil }) -- "OPRA_001",
end
return { Port0, Port1, Interval = 30e9, }