VPP SNMP AgentX Bridge
A Go application that bridges VPP (Vector Packet Processing) interface statistics to SNMP using the AgentX protocol. It queries VPP interface counters and exposes them via the standard IF-MIB (1.3.6.1.2.1.31.1.1.1) for SNMP monitoring.
Features
- Real-time VPP interface statistics via SNMP
- Standard IF-MIB compliance (ifXTable)
- AgentX protocol support (TCP and Unix sockets)
- Configurable interface index offset to avoid conflicts
- Configurable polling intervals
- Thread-safe operation with proper synchronization
Architecture
VPP Stats Socket → VPP Stats Client → Interface MIB → AgentX → SNMP Master Agent
The application consists of three main components:
- VPP Stats Client (
vppstats/
): Connects to VPP stats socket and retrieves interface counters - Interface MIB (
ifmib/
): Maps VPP statistics to SNMP IF-MIB structure - AgentX Client: Registers with SNMP master agent to serve the MIB data
Build Instructions
Development Build
go build -o vpp-snmp-agent .
Static Binary Build
For deployment without Go runtime dependencies:
# Linux static binary
CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o vpp-snmp-agent .
# Cross-compile for different architectures
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' -o vpp-snmp-agent-linux-amd64 .
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -a -ldflags '-extldflags "-static"' -o vpp-snmp-agent-linux-arm64 .
Release Build with Version Info
VERSION=$(git describe --tags --always --dirty)
BUILD_TIME=$(date -u '+%Y-%m-%d_%H:%M:%S')
CGO_ENABLED=0 go build -ldflags "-X main.version=${VERSION} -X main.buildTime=${BUILD_TIME}" -o vpp-snmp-agent .
Usage
Basic Usage
# Run with default settings
./vpp-snmp-agent
# Run with custom AgentX address
./vpp-snmp-agent -agentx-addr 127.0.0.1:705
# Run with Unix socket AgentX connection
./vpp-snmp-agent -agentx-addr /var/agentx/master
Command Line Flags
General Application Flags
Flag | Default | Description |
---|---|---|
-agentx-addr |
localhost:705 |
AgentX master agent address (hostname:port or Unix socket path) |
-debug |
false |
Enable debug logging |
VPP Statistics Module Flags
Flag | Default | Description |
---|---|---|
-vppstats.addr |
/var/run/vpp/stats.sock |
VPP statistics socket path |
-vppstats.period |
10 |
Interval in seconds for querying VPP interface stats |
-vppstats.ifindex-offset |
1000 |
Offset to add to VPP interface indices for SNMP |
Examples
# Enable debug logging
./vpp-snmp-agent -debug
# Custom polling interval (5 seconds)
./vpp-snmp-agent -vppstats.period 5
# Custom VPP stats socket
./vpp-snmp-agent -vppstats.addr /custom/path/stats.sock
# Custom interface index offset (start at 2000)
./vpp-snmp-agent -vppstats.ifindex-offset 2000
# Full configuration
./vpp-snmp-agent \
-agentx-addr /var/agentx/master \
-debug \
-vppstats.addr /var/run/vpp/stats.sock \
-vppstats.period 5 \
-vppstats.ifindex-offset 1000
SNMP Interface Mapping
VPP interfaces are mapped to SNMP indices with a configurable offset (default 1000):
- VPP Interface 0 → SNMP Index 1000
- VPP Interface 1 → SNMP Index 1001
- VPP Interface N → SNMP Index (N + offset)
Supported MIB Objects
The application implements the ifXTable (1.3.6.1.2.1.31.1.1.1) with the following objects:
OID | Object | Type | Description |
---|---|---|---|
.1.{index} |
ifName | DisplayString | Interface name |
.2.{index} |
ifInMulticastPkts | Counter32 | RX multicast packets |
.3.{index} |
ifInBroadcastPkts | Counter32 | RX broadcast packets |
.4.{index} |
ifOutMulticastPkts | Counter32 | TX multicast packets |
.5.{index} |
ifOutBroadcastPkts | Counter32 | TX broadcast packets |
.6.{index} |
ifHCInOctets | Counter64 | RX bytes (high capacity) |
.7.{index} |
ifHCInUcastPkts | Counter64 | RX unicast packets (high capacity) |
.8.{index} |
ifHCInMulticastPkts | Counter64 | RX multicast packets (high capacity) |
.9.{index} |
ifHCInBroadcastPkts | Counter64 | RX broadcast packets (high capacity) |
.10.{index} |
ifHCOutOctets | Counter64 | TX bytes (high capacity) |
.11.{index} |
ifHCOutUcastPkts | Counter64 | TX unicast packets (high capacity) |
.12.{index} |
ifHCOutMulticastPkts | Counter64 | TX multicast packets (high capacity) |
.13.{index} |
ifHCOutBroadcastPkts | Counter64 | TX broadcast packets (high capacity) |
SNMP Query Examples
Query Interface Names
# Get all interface names
snmpwalk -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1.1
# Get specific interface name (interface 0 with default offset)
snmpget -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1.1.1000
Query Interface Counters
# Get RX bytes for interface 0
snmpget -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1.6.1000
# Get TX bytes for interface 1
snmpget -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1.10.1001
# Walk all interface counters
snmpwalk -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1
Query with Custom Offset
If running with -vppstats.ifindex-offset 2000
:
# Interface 0 counters at index 2000
snmpget -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1.6.2000
Prerequisites
VPP Requirements
- VPP must be running with stats socket enabled
- Stats socket accessible at
/var/run/vpp/stats.sock
(or custom path) - Application must have read permissions on the stats socket
SNMP Requirements
- SNMP master agent running (net-snmp's snmpd)
- AgentX protocol enabled in snmpd configuration
- AgentX socket accessible (TCP port 705 or Unix socket)
SNMP Agent Configuration
Add to /etc/snmp/snmpd.conf
:
# Enable AgentX
master agentx
agentXSocket tcp:localhost:705
# or for Unix socket:
# agentXSocket /var/agentx/master
Troubleshooting
Common Issues
-
"Failed to connect to VPP stats"
- Check VPP is running:
vppctl show version
- Verify stats socket exists:
ls -la /var/run/vpp/stats.sock
- Check permissions on stats socket
- Check VPP is running:
-
"Failed to dial AgentX"
- Verify SNMP agent is running:
systemctl status snmpd
- Check AgentX is enabled in snmpd.conf
- Test AgentX socket:
netstat -ln | grep 705
- Verify SNMP agent is running:
-
"Failed to register IF-MIB: ErrorDuplicateRegistration"
- Another agent is already serving the IF-MIB
- Check with:
snmpwalk -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1
-
"Retrieved stats for 0 interfaces"
- VPP may have no interfaces configured
- Check VPP interfaces:
vppctl show interface
Debug Commands
# Check VPP interfaces
vppctl show interface
# Check VPP stats
vppctl show stats
# Test SNMP master agent
snmpwalk -v2c -c public localhost 1.3.6.1.2.1.1
# Check AgentX registration
snmpwalk -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1
License
This project uses the LGPL 3.0 licensed go-agentx library.
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
Version History
- v1.0.0: Initial release with IF-MIB support
- v1.1.0: Added configurable interface index offset
- v1.2.0: Added Unix socket support for AgentX