Skip to content
Functional Networking Framework for Multi-Core Architectures
C C++ Haskell Groff HTML Yacc Other
Failed to load latest commit information.
Development SimpleBuilder updated. Sep 29, 2015
docs Version number updated. Sep 26, 2015
kernel Fix: sk_alloc for kernel >= 4.2 has an additional kern parameter. Jan 6, 2016
misc Minor changes, and tests and libraries updated. Oct 1, 2015
user pfq.example.conf updated. Dec 2, 2015
.gitignore
AUTHORS Added Luca Abeni as contrubutor Mar 1, 2014
Build.hs Build script update. Sep 24, 2015
CHANGELOG.md CHANGELOG/README updated. Sep 26, 2015
INSTALL.md INSTALL updated. Dec 28, 2015
LICENSE GPL file lincese added. Jul 24, 2014
README.md CHANGELOG/README updated. Sep 26, 2015
VERSION v5.2.11 Dec 30, 2015
cabal.config cabal.config updated: lts-2 for GHC-7.8 and lts-3 for GHC-7.10. Aug 18, 2015
cabal.config-LTS-2-GHC-7.8 cabal.config updated: lts-2 for GHC-7.8 and lts-3 for GHC-7.10. Aug 18, 2015
cabal.config-LTS-3-GHC-7.10 TLS-3 packages list updated. Dec 28, 2015
pfq-framework.cabal Version number updated. Sep 26, 2015

README.md

PFQ v5.2

Introduction

PFQ is a functional networking framework designed for the Linux operating system that allows efficient packets capture/transmission (10G and beyond), in-kernel functional processing and packets steering across sockets/end-points.

PFQ is highly optimized for multi-core architecture, as well as for network devices equipped with multiple hardware queues. It works with any network device driver and provides a script designed to obtain accelerated versions starting from source codes.

The framework enables the development of high-performance networking applications with different programming languages: C, C++ and Haskell. In addition, a pure functional language designed for early stages in-kernel applications is included: pfq-lang.

pfq-lang is inspired by Haskell and allows the creation of small applications that run in kernel space, on top of network device drivers. Through pfq-lang it is possible to build efficient bridges, port mirrors, simple firewalls, network balancers and so forth.

The package provides the source code of the PFQ kernel module, user-space libraries for C, C++11-14 and Haskell language, an implementation of pfq-lang as eDSL for both C++11-14 and Haskell, and a set of diagnostic tools.

Features

  • Full lock-free architecture.
  • Preallocated pools of socket buffers.
  • Compliant with a plethora of network devices drivers.
  • Rx and Tx line-rate on 10G links (14,8 Mpps), on-top-of Intel ixgbe vanilla drivers.
  • Transparent support of kernel threads for asynchronous packets transmission.
  • Asynchronous transmission with active timestamping (which determines when to transmit a packet).
  • Concurrent monitoring of multiple multi-threaded applications by means of groups of sockets.
  • Per-group packet steering through randomized hashing or deterministic classification.
  • Per-group Berkeley and VLAN filters.
  • Functional engine for in-kernel packet processing with pfq-lang.
  • User-space libraries for C, C++11-14 and Haskell languages.
  • pfq-lang eDLS for C++11-14 and Haskell language.
  • Accelerated pcap library (line-speed tested with captop).
  • pfqd daemon used to parallelize multiple instances of pcap legacy applications.
  • pfq-omatic, a script designed to accelerate vanilla drivers.
  • I/O user<->kernel shared-memory on top of HugePages.

Publications

  • "PFQ: a Novel Engine for Multi-Gigabit Packet Capturing With Multi-Core Commodity Hardware": Best-Paper-Award at PAM2012 in Vienna http://tma2012.ftw.at/papers/PAM2012paper12.pdf
  • "A Purely Functional Approach to Packet Processing": ANCS 2014 Conference (October 2014, Marina del Rey)

Author

Nicola Bonelli nicola@pfq.io

Contributors

Andrea Di Pietro andrea.dipietro@for.unipi.it

Loris Gazzarrini loris.gazzarrini@iet.unipi.it

Gregorio Procissi g.procissi@iet.unipi.it

Luca Abeni abeni@dit.unitn.it

HomePages

PFQ home-page is www.pfq.io. Additional information are available at netgroup/pfq.

Something went wrong with that request. Please try again.