2025-06-09 17:51:06 +02:00
2025-06-09 17:51:06 +02:00
2025-06-09 17:38:27 +02:00
2025-06-09 17:13:07 +02:00
2025-06-09 17:13:07 +02:00
2025-06-09 17:51:06 +02:00
2025-06-09 17:45:54 +02:00

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:

  1. VPP Stats Client (vppstats/): Connects to VPP stats socket and retrieves interface counters
  2. Interface MIB (ifmib/): Maps VPP statistics to SNMP IF-MIB structure
  3. 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

Flag Default Description
-agentx-addr localhost:705 AgentX master agent address (hostname:port or Unix socket path)
-vpp-stats-addr /var/run/vpp/stats.sock VPP statistics socket path
-period 10.0 Interval in seconds for querying VPP interface stats
-vpp-ifindex-offset 1000 Offset to add to VPP interface indices for SNMP

Examples

# Custom polling interval (5 seconds)
./vpp-snmp-agent -period 5.0

# Custom VPP stats socket
./vpp-snmp-agent -vpp-stats-addr /custom/path/stats.sock

# Custom interface index offset (start at 2000)
./vpp-snmp-agent -vpp-ifindex-offset 2000

# Full configuration
./vpp-snmp-agent \
  -agentx-addr /var/agentx/master \
  -vpp-stats-addr /var/run/vpp/stats.sock \
  -period 5.0 \
  -vpp-ifindex-offset 1000

SNMP Interface Mapping

VPP interfaces are mapped to SNMP indices with a configurable offset (default 1000):

  • VPP Interface 0SNMP Index 1000
  • VPP Interface 1SNMP Index 1001
  • VPP Interface NSNMP 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 -vpp-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

  1. "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
  2. "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
  3. "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
  4. "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

  1. Fork the repository
  2. Create a feature branch
  3. Make your changes
  4. Add tests if applicable
  5. 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
Description
An SNMP AgentX which passes GoVPP stats to SNMPd
Readme 127 KiB
Languages
Go 99.3%
Makefile 0.6%
Nix 0.1%