A P4Runtime-native SDN simulation framework for BMv2.
Project description
p4net
A P4Runtime-native SDN simulation framework for BMv2.
Status: 1.3.0 — stable. Public API committed per API Stability. Patch releases for fixes; minor releases for new functionality with deprecation cycles where needed.
Features
- P4Runtime-native control plane.
- BMv2
simple_switch_grpcdata plane. - Linux network-namespace based hosts.
- veth-based links with
tc/netemimpairment. - Programmable Python topology DSL.
- Interactive CLI.
- Per-port packet capture.
- P4Runtime CPU-port packet I/O (
<switch> packet send/listen). - IPv4 and IPv6 host addressing with per-interface sysctl gating.
- Asymmetric link impairment (per-direction
bandwidth,delay,jitter,loss_pct). - Topology visualization (Graphviz DOT / PNG / SVG).
- In-band network telemetry (INT) — single-switch introduction plus a multi-hop production-style example.
- Direct P4 register read/write via P4Runtime gRPC.
- Unified
p4net.*logger hierarchy with CLI verbosity control. - No OpenFlow, no Open vSwitch, no Docker.
Requirements
- Linux kernel >= 5.4.
- Python 3.10+.
- BMv2 and p4c installed system-wide.
- Root or
CAP_NET_ADMINto manage namespaces and veth devices.
Installation
From a fresh checkout:
git clone https://github.com/zhh2001/p4net
cd p4net
python3 -m venv .venv
. .venv/bin/activate
pip install -e '.[dev]'
PyPI distribution may follow a future release.
Quick Start
from pathlib import Path
from p4net import Network
from p4net.topo import Topology
topo = Topology()
h1 = topo.add_host("h1", ip="10.0.0.1/24", mac="00:00:00:00:00:01")
h2 = topo.add_host("h2", ip="10.0.0.2/24", mac="00:00:00:00:00:02")
s1 = topo.add_switch("s1", p4_src=Path("quick_start.p4"))
topo.add_link(h1, s1, port_b=1)
topo.add_link(h2, s1, port_b=2)
with Network(topo) as net:
print(net.pingall())
A complete runnable version, including the matching quick_start.p4
(a port-2-port swap that needs no runtime table programming) and a tiny
static-ARP setup, lives in examples/quick_start/. Run it with:
sudo python examples/quick_start/quick_start.py
or, equivalently, with the p4net console script installed by
pip install -e .:
sudo p4net examples/quick_start/quick_start.py
The console script loads any .py file that defines a module-level
topology: Topology (and optionally setup(net)), brings up the
network, and drops you into an interactive shell. If sudo strips your
venv from PATH, run the binary explicitly: sudo env "PATH=$PATH" p4net ....
Examples
examples/quick_start/— minimal two-host network with a hardcoded port-swap pipeline.examples/l3_forwarding/— runtime-programmed IPv4 LPM with static ARP.examples/cpu_punt/— every dataplane packet punted to the controller; demonstrates<switch> packet send/<switch> packet listen.examples/dual_stack/— two hosts carrying both IPv4 and IPv6.examples/asymmetric_link/— per-directiondelayshaping.examples/ipv6_lpm/— runtime-programmed IPv6 LPM forwarding.examples/int/— single-switch in-band network telemetry: the pipeline inserts a 14-byte INT shim into every forwarded packet; a raw-socket listener decodes it on the receiver.examples/int_multi_hop/— multi-hop INT on a two-switch linear path; the listener decodes the full hop-by-hop stack. Production-style telemetry topology.
Documentation
Full documentation: https://zhh2001.github.io/p4net/
The English site is the authoritative reference; a Chinese translation layer is being added incrementally. Pages on the site cover installation, a tutorial, an architecture overview, the CLI reference, the auto-generated API reference, troubleshooting, a glossary, and per-example walk-throughs.
The source for these pages lives under docs/ and is built
with MkDocs Material.
License
Apache-2.0.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file p4net-1.3.0.tar.gz.
File metadata
- Download URL: p4net-1.3.0.tar.gz
- Upload date:
- Size: 261.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
25818a37fbb96dc0710f05a2a403d87b3dbf25b0ab4683c111fd2d77b53c4efd
|
|
| MD5 |
ab10979cb5479bb1aaed1fc63f0f2444
|
|
| BLAKE2b-256 |
25d3e830343c7ac30fadb3424513c1165bc96ced420b9478c386b79d71b5f0dc
|
File details
Details for the file p4net-1.3.0-py3-none-any.whl.
File metadata
- Download URL: p4net-1.3.0-py3-none-any.whl
- Upload date:
- Size: 82.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5713c4f36d22d819262fd5592007abd13465fb53c2b38b28bf8d7e9ba19ff052
|
|
| MD5 |
0d28fcef06e363b2ed2c7f2d09106679
|
|
| BLAKE2b-256 |
b8304e9335e2355debb8ae7328bd1a848432c869e9e8c35b4b38a4c765272a86
|