Compare commits
8 Commits
c0bcdd5449
...
main
Author | SHA1 | Date | |
---|---|---|---|
42dbbded3d | |||
f16a2b41ea | |||
5533ab00de | |||
1cbca296c4 | |||
a73c7cbf91 | |||
1ddc77ec73 | |||
6063db7311 | |||
7f81b51c1f |
14
Makefile
14
Makefile
@ -1,19 +1,21 @@
|
|||||||
|
PROG = govpp-snmp-agentx
|
||||||
|
|
||||||
.PHONY: build test clean pkg-deb
|
.PHONY: build test clean pkg-deb
|
||||||
|
|
||||||
# Build the govpp-snmp-agentx binary
|
# Build the binary
|
||||||
build:
|
build:
|
||||||
go build -o govpp-snmp-agentx .
|
cd src && go build -o ../$(PROG) .
|
||||||
|
|
||||||
# Run all tests
|
# Run all tests
|
||||||
test:
|
test:
|
||||||
go test ./...
|
cd src && go test ./...
|
||||||
|
|
||||||
# Clean build artifacts
|
# Clean build artifacts
|
||||||
clean:
|
clean:
|
||||||
rm -f govpp-snmp-agentx
|
rm -f $(PROG)
|
||||||
[ -d debian/go ] && chmod -R +w debian/go || true
|
[ -d debian/go ] && chmod -R +w debian/go || true
|
||||||
rm -rf debian/.debhelper debian/.gocache debian/go debian/govpp-snmp-agentx debian/files debian/*.substvars debian/debhelper-build-stamp
|
rm -rf debian/.debhelper debian/.gocache debian/go debian/$(PROG) debian/files debian/*.substvars debian/debhelper-build-stamp
|
||||||
rm -f ../govpp-snmp-agentx_*
|
rm -f ../$(PROG)_*.deb ../$(PROG)_*.changes ../$(PROG)_*.buildinfo
|
||||||
|
|
||||||
# Build Debian package
|
# Build Debian package
|
||||||
pkg-deb:
|
pkg-deb:
|
||||||
|
321
README.md
321
README.md
@ -1,315 +1,46 @@
|
|||||||
# VPP SNMP AgentX Bridge
|
# VPP SNMP AgentX Bridge
|
||||||
|
|
||||||
A Go application that bridges VPP (Vector Packet Processing) interface statistics to SNMP using the
|
SNMP AgentX daemon that exposes VPP interface statistics via standard IF-MIB.
|
||||||
AgentX protocol. It queries VPP interface counters and exposes them via the standard IF-MIB
|
|
||||||
for SNMP monitoring.
|
|
||||||
|
|
||||||
## Features
|
## Quick Start
|
||||||
|
|
||||||
- **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 → SNMPd
|
|
||||||
```
|
|
||||||
|
|
||||||
The application consists of four 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** (`agentx/`): Handles AgentX protocol connection and MIB registration
|
|
||||||
4. **Main Application**: Orchestrates the components and handles configuration
|
|
||||||
|
|
||||||
## Build Instructions
|
|
||||||
|
|
||||||
### Development Build
|
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go build -o govpp-snmp-agentx .
|
# Build
|
||||||
|
make build
|
||||||
|
|
||||||
|
# Test
|
||||||
|
make test
|
||||||
|
|
||||||
|
# Create Debian package
|
||||||
|
make pkg-deb
|
||||||
|
|
||||||
|
# Install package
|
||||||
|
sudo dpkg -i ../govpp-snmp-agentx_*.deb
|
||||||
```
|
```
|
||||||
|
|
||||||
### Static Binary Build
|
## Configuration
|
||||||
|
|
||||||
For deployment without Go runtime dependencies:
|
The Debian package installs a systemd service that reads configuration from `/etc/default/govpp-snmp-agentx`:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Linux static binary
|
# Edit service configuration
|
||||||
CGO_ENABLED=0 GOOS=linux go build -a -ldflags '-extldflags "-static"' -o govpp-snmp-agentx .
|
sudo nano /etc/default/govpp-snmp-agentx
|
||||||
|
|
||||||
# Cross-compile for different architectures
|
# Start service
|
||||||
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' -o govpp-snmp-agentx-linux-amd64 .
|
sudo systemctl start govpp-snmp-agentx
|
||||||
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -a -ldflags '-extldflags "-static"' -o govpp-snmp-agentx-linux-arm64 .
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Release Build with Version Info
|
Default configuration:
|
||||||
|
```
|
||||||
```bash
|
GOVPP_SNMP_AGENTX_FLAGS="-agentx.addr /var/agentx/master -vppcfg /etc/vpp/vppcfg.yaml -vppstats.period 10"
|
||||||
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 govpp-snmp-agentx .
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Usage
|
## Documentation
|
||||||
|
|
||||||
### Basic Usage
|
- **Manual page**: `man govpp-snmp-agentx` (after package installation)
|
||||||
|
- **Detailed documentation**: [docs/DETAILS.md](docs/DETAILS.md)
|
||||||
```bash
|
|
||||||
# Run with default settings
|
|
||||||
./govpp-snmp-agentx
|
|
||||||
|
|
||||||
# Run with custom AgentX address
|
|
||||||
./govpp-snmp-agentx -agentx.addr 127.0.0.1:705
|
|
||||||
|
|
||||||
# Run with Unix socket AgentX connection
|
|
||||||
./govpp-snmp-agentx -agentx.addr /var/agentx/master
|
|
||||||
```
|
|
||||||
|
|
||||||
### Command Line Flags
|
|
||||||
|
|
||||||
#### General Application Flags
|
|
||||||
|
|
||||||
| Flag | Default | Description |
|
|
||||||
|------|---------|-------------|
|
|
||||||
| `-debug` | `false` | Enable debug logging |
|
|
||||||
| `-vppcfg` | `""` | VPP configuration YAML file to read interface descriptions from |
|
|
||||||
|
|
||||||
#### AgentX Module Flags
|
|
||||||
|
|
||||||
| Flag | Default | Description |
|
|
||||||
|------|---------|-------------|
|
|
||||||
| `-agentx.addr` | `localhost:705` | AgentX master agent address (hostname:port or Unix socket path) |
|
|
||||||
|
|
||||||
#### VPP Statistics Module Flags
|
|
||||||
|
|
||||||
| Flag | Default | Description |
|
|
||||||
|------|---------|-------------|
|
|
||||||
| `-vppstats.api.addr` | `/var/run/vpp/api.sock` | VPP API socket path |
|
|
||||||
| `-vppstats.stats.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
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Enable debug logging
|
|
||||||
./govpp-snmp-agentx -debug
|
|
||||||
|
|
||||||
# Custom polling interval (5 seconds)
|
|
||||||
./govpp-snmp-agentx -vppstats.period 5
|
|
||||||
|
|
||||||
# Custom VPP stats socket
|
|
||||||
./govpp-snmp-agentx -vppstats.stats.addr /custom/path/stats.sock
|
|
||||||
|
|
||||||
# Custom VPP API socket
|
|
||||||
./govpp-snmp-agentx -vppstats.api.addr /custom/path/api.sock
|
|
||||||
|
|
||||||
# Custom interface index offset (start at 2000)
|
|
||||||
./govpp-snmp-agentx -vppstats.ifindex-offset 2000
|
|
||||||
|
|
||||||
# With VPP configuration file for interface descriptions
|
|
||||||
./govpp-snmp-agentx -vppcfg /etc/vpp/vppcfg.yaml
|
|
||||||
|
|
||||||
# Full configuration
|
|
||||||
./govpp-snmp-agentx \
|
|
||||||
-agentx.addr /var/agentx/master \
|
|
||||||
-debug \
|
|
||||||
-vppcfg /etc/vpp/vppcfg.yaml \
|
|
||||||
-vppstats.api.addr /var/run/vpp/api.sock \
|
|
||||||
-vppstats.stats.addr /var/run/vpp/stats.sock \
|
|
||||||
-vppstats.period 5 \
|
|
||||||
-vppstats.ifindex-offset 1000
|
|
||||||
```
|
|
||||||
|
|
||||||
## VPP Configuration File
|
|
||||||
|
|
||||||
The `-vppcfg` flag accepts a YAML configuration file that describes VPP interfaces and their descriptions. This file is used to populate the `ifAlias` (.18) field in the ifXTable with meaningful interface descriptions.
|
|
||||||
|
|
||||||
### YAML Format Example
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
interfaces:
|
|
||||||
GigabitEthernet82/0/0:
|
|
||||||
description: 'Infra: Management interface'
|
|
||||||
TenGigabitEthernet1/0/2:
|
|
||||||
description: 'Infra: Core uplink'
|
|
||||||
sub-interfaces:
|
|
||||||
100:
|
|
||||||
description: 'Cust: Customer VLAN 100'
|
|
||||||
200:
|
|
||||||
description: 'Transit: Provider VLAN 200'
|
|
||||||
loopbacks:
|
|
||||||
loop0:
|
|
||||||
description: 'Core: Router loopback'
|
|
||||||
```
|
|
||||||
|
|
||||||
### Description Mapping
|
|
||||||
|
|
||||||
- **Main interfaces**: Use the `description` field directly
|
|
||||||
- **Sub-interfaces**: Use the `description` field from the `sub-interfaces` section
|
|
||||||
- **Loopbacks**: Use the `description` field from the `loopbacks` section
|
|
||||||
- **Fallback**: If no description is found, the interface name is used as the alias
|
|
||||||
|
|
||||||
## 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) |
|
|
||||||
| `.18.{index}` | ifAlias | DisplayString | Interface description/alias (from VPP config or interface name) |
|
|
||||||
|
|
||||||
## SNMP Query Examples
|
|
||||||
|
|
||||||
### Query Interface Names
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 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 Descriptions
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Get all interface descriptions/aliases
|
|
||||||
snmpwalk -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1.18
|
|
||||||
|
|
||||||
# Get specific interface description (interface 0 with default offset)
|
|
||||||
snmpget -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1.18.1000
|
|
||||||
```
|
|
||||||
|
|
||||||
### Query Interface Counters
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 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`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 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
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 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
|
## License
|
||||||
|
|
||||||
This project uses the LGPL 3.0 licensed go-agentx library. It has been modified due to a bug,
|
LGPL 3.0 (due to modified go-agentx dependency)
|
||||||
see details in [[GitHub PR#7](https://github.com/posteo/go-agentx/pull/11)], and as such is
|
|
||||||
licensed also LGPL 3.0. The go-agentx source code in this project will be removed once the
|
|
||||||
upstream PR is merged.
|
|
||||||
|
|
||||||
## 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
|
|
||||||
|
|
||||||
|
18
debian/changelog
vendored
18
debian/changelog
vendored
@ -1,3 +1,21 @@
|
|||||||
|
govpp-snmp-agentx (1.0.3-1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* Remove unnecessary toolchain configuration
|
||||||
|
* Simplify and shorten Makefile
|
||||||
|
* Refactor documentation structure with detailed DETAILS.md
|
||||||
|
* Update and improve README documentation
|
||||||
|
|
||||||
|
-- Pim van Pelt <pim@ipng.ch> Thu, 19 Jun 2025 00:00:00 +0000
|
||||||
|
|
||||||
|
govpp-snmp-agentx (1.0.2-1) bookworm; urgency=medium
|
||||||
|
|
||||||
|
* Reorganize source code into src/ subdirectory for cleaner project structure
|
||||||
|
* Add environment file support (/etc/default/govpp-snmp-agentx)
|
||||||
|
* Move service configuration to environment variables
|
||||||
|
* Improve systemd service configurability
|
||||||
|
|
||||||
|
-- Pim van Pelt <pim@ipng.ch> Tue, 17 Jun 2025 00:55:00 +0000
|
||||||
|
|
||||||
govpp-snmp-agentx (1.0.1-1) bookworm; urgency=medium
|
govpp-snmp-agentx (1.0.1-1) bookworm; urgency=medium
|
||||||
|
|
||||||
* Add manual page for govpp-snmp-agentx(1)
|
* Add manual page for govpp-snmp-agentx(1)
|
||||||
|
4
debian/control
vendored
4
debian/control
vendored
@ -2,7 +2,7 @@ Source: govpp-snmp-agentx
|
|||||||
Section: net
|
Section: net
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Maintainer: Pim van Pelt <pim@ipng.ch>
|
Maintainer: Pim van Pelt <pim@ipng.ch>
|
||||||
Build-Depends: debhelper-compat (= 13), golang-go (>= 1.21)
|
Build-Depends: debhelper-compat (= 13), golang-go (>= 1.23.8)
|
||||||
Standards-Version: 4.6.2
|
Standards-Version: 4.6.2
|
||||||
Homepage: https://git.ipng.ch/ipng/govpp-agentx-snmp
|
Homepage: https://git.ipng.ch/ipng/govpp-agentx-snmp
|
||||||
Vcs-Git: https://git.ipng.ch/ipng/govpp-agentx-snmp
|
Vcs-Git: https://git.ipng.ch/ipng/govpp-agentx-snmp
|
||||||
@ -10,7 +10,7 @@ Vcs-Browser: https://git.ipng.ch/ipng/govpp-agentx-snmp
|
|||||||
|
|
||||||
Package: govpp-snmp-agentx
|
Package: govpp-snmp-agentx
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${misc:Depends}, ${shlibs:Depends}, snmp, snmpd, adduser
|
Depends: ${misc:Depends}, ${shlibs:Depends}, snmpd
|
||||||
Description: GoVPP SNMP AgentX Daemon
|
Description: GoVPP SNMP AgentX Daemon
|
||||||
A SNMP AgentX daemon that provides SNMP access to VPP (Vector Packet Processing)
|
A SNMP AgentX daemon that provides SNMP access to VPP (Vector Packet Processing)
|
||||||
statistics and interface information. This daemon acts as a subagent that
|
statistics and interface information. This daemon acts as a subagent that
|
||||||
|
3
debian/rules
vendored
3
debian/rules
vendored
@ -10,11 +10,12 @@ export GOPATH = $(CURDIR)/debian/go
|
|||||||
dh $@
|
dh $@
|
||||||
|
|
||||||
override_dh_auto_build:
|
override_dh_auto_build:
|
||||||
go build -v -ldflags="-s -w" -o govpp-snmp-agentx .
|
cd src && go build -v -ldflags="-s -w" -o ../govpp-snmp-agentx .
|
||||||
|
|
||||||
override_dh_auto_install:
|
override_dh_auto_install:
|
||||||
install -D -m 0755 govpp-snmp-agentx debian/govpp-snmp-agentx/usr/sbin/govpp-snmp-agentx
|
install -D -m 0755 govpp-snmp-agentx debian/govpp-snmp-agentx/usr/sbin/govpp-snmp-agentx
|
||||||
install -D -m 0644 govpp-snmp-agentx.service debian/govpp-snmp-agentx/lib/systemd/system/govpp-snmp-agentx.service
|
install -D -m 0644 govpp-snmp-agentx.service debian/govpp-snmp-agentx/lib/systemd/system/govpp-snmp-agentx.service
|
||||||
|
install -D -m 0644 govpp-snmp-agentx.default debian/govpp-snmp-agentx/etc/default/govpp-snmp-agentx
|
||||||
install -D -m 0644 docs/govpp-snmp-agentx.1 debian/govpp-snmp-agentx/usr/share/man/man1/govpp-snmp-agentx.1
|
install -D -m 0644 docs/govpp-snmp-agentx.1 debian/govpp-snmp-agentx/usr/share/man/man1/govpp-snmp-agentx.1
|
||||||
|
|
||||||
override_dh_auto_configure:
|
override_dh_auto_configure:
|
||||||
|
266
docs/DETAILS.md
Normal file
266
docs/DETAILS.md
Normal file
@ -0,0 +1,266 @@
|
|||||||
|
# VPP SNMP AgentX Bridge - Detailed Documentation
|
||||||
|
|
||||||
|
## 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 → SNMPd
|
||||||
|
```
|
||||||
|
|
||||||
|
The application consists of four main components:
|
||||||
|
|
||||||
|
1. **VPP Stats Client** (`src/vppstats/`): Connects to VPP stats socket and retrieves interface counters
|
||||||
|
2. **Interface MIB** (`src/ifmib/`): Maps VPP statistics to SNMP IF-MIB structure
|
||||||
|
3. **AgentX Client** (`src/agentx/`): Handles AgentX protocol connection and MIB registration
|
||||||
|
4. **Main Application** (`src/main.go`): Orchestrates the components and handles configuration
|
||||||
|
|
||||||
|
## Command Line Flags
|
||||||
|
|
||||||
|
### General Application Flags
|
||||||
|
|
||||||
|
| Flag | Default | Description |
|
||||||
|
|------|---------|-------------|
|
||||||
|
| `-debug` | `false` | Enable debug logging |
|
||||||
|
| `-vppcfg` | `""` | VPP configuration YAML file to read interface descriptions from |
|
||||||
|
|
||||||
|
### AgentX Module Flags
|
||||||
|
|
||||||
|
| Flag | Default | Description |
|
||||||
|
|------|---------|-------------|
|
||||||
|
| `-agentx.addr` | `localhost:705` | AgentX master agent address (hostname:port or Unix socket path) |
|
||||||
|
|
||||||
|
### VPP Statistics Module Flags
|
||||||
|
|
||||||
|
| Flag | Default | Description |
|
||||||
|
|------|---------|-------------|
|
||||||
|
| `-vppstats.api.addr` | `/var/run/vpp/api.sock` | VPP API socket path |
|
||||||
|
| `-vppstats.stats.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 |
|
||||||
|
|
||||||
|
## Usage Examples
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Enable debug logging
|
||||||
|
./govpp-snmp-agentx -debug
|
||||||
|
|
||||||
|
# Custom polling interval (5 seconds)
|
||||||
|
./govpp-snmp-agentx -vppstats.period 5
|
||||||
|
|
||||||
|
# Custom VPP stats socket
|
||||||
|
./govpp-snmp-agentx -vppstats.stats.addr /custom/path/stats.sock
|
||||||
|
|
||||||
|
# Custom VPP API socket
|
||||||
|
./govpp-snmp-agentx -vppstats.api.addr /custom/path/api.sock
|
||||||
|
|
||||||
|
# Custom interface index offset (start at 2000)
|
||||||
|
./govpp-snmp-agentx -vppstats.ifindex-offset 2000
|
||||||
|
|
||||||
|
# With VPP configuration file for interface descriptions
|
||||||
|
./govpp-snmp-agentx -vppcfg /etc/vpp/vppcfg.yaml
|
||||||
|
|
||||||
|
# Full configuration
|
||||||
|
./govpp-snmp-agentx \
|
||||||
|
-agentx.addr /var/agentx/master \
|
||||||
|
-debug \
|
||||||
|
-vppcfg /etc/vpp/vppcfg.yaml \
|
||||||
|
-vppstats.api.addr /var/run/vpp/api.sock \
|
||||||
|
-vppstats.stats.addr /var/run/vpp/stats.sock \
|
||||||
|
-vppstats.period 5 \
|
||||||
|
-vppstats.ifindex-offset 1000
|
||||||
|
```
|
||||||
|
|
||||||
|
## VPP Configuration File
|
||||||
|
|
||||||
|
The `-vppcfg` flag accepts a YAML configuration file that describes VPP interfaces and their descriptions. This file is used to populate the `ifAlias` (.18) field in the ifXTable with meaningful interface descriptions.
|
||||||
|
|
||||||
|
### YAML Format Example
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
interfaces:
|
||||||
|
GigabitEthernet82/0/0:
|
||||||
|
description: 'Infra: Management interface'
|
||||||
|
TenGigabitEthernet1/0/2:
|
||||||
|
description: 'Infra: Core uplink'
|
||||||
|
sub-interfaces:
|
||||||
|
100:
|
||||||
|
description: 'Cust: Customer VLAN 100'
|
||||||
|
200:
|
||||||
|
description: 'Transit: Provider VLAN 200'
|
||||||
|
loopbacks:
|
||||||
|
loop0:
|
||||||
|
description: 'Core: Router loopback'
|
||||||
|
```
|
||||||
|
|
||||||
|
### Description Mapping
|
||||||
|
|
||||||
|
- **Main interfaces**: Use the `description` field directly
|
||||||
|
- **Sub-interfaces**: Use the `description` field from the `sub-interfaces` section
|
||||||
|
- **Loopbacks**: Use the `description` field from the `loopbacks` section
|
||||||
|
- **Fallback**: If no description is found, the interface name is used as the alias
|
||||||
|
|
||||||
|
## 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) |
|
||||||
|
| `.18.{index}` | ifAlias | DisplayString | Interface description/alias (from VPP config or interface name) |
|
||||||
|
|
||||||
|
## SNMP Query Examples
|
||||||
|
|
||||||
|
### Query Interface Names
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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 Descriptions
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Get all interface descriptions/aliases
|
||||||
|
snmpwalk -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1.18
|
||||||
|
|
||||||
|
# Get specific interface description (interface 0 with default offset)
|
||||||
|
snmpget -v2c -c public localhost 1.3.6.1.2.1.31.1.1.1.18.1000
|
||||||
|
```
|
||||||
|
|
||||||
|
### Query Interface Counters
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# 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. It has been modified due to a bug,
|
||||||
|
see details in [[GitHub PR#7](https://github.com/posteo/go-agentx/pull/11)], and as such is
|
||||||
|
licensed also LGPL 3.0. The go-agentx source code in this project will be removed once the
|
||||||
|
upstream PR is merged.
|
||||||
|
|
||||||
|
## 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
|
15
govpp-snmp-agentx.default
Normal file
15
govpp-snmp-agentx.default
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# Default configuration for govpp-snmp-agentx
|
||||||
|
# This file contains environment variables for the GoVPP SNMP AgentX daemon
|
||||||
|
#
|
||||||
|
# Command line flags for govpp-snmp-agentx
|
||||||
|
GOVPP_SNMP_AGENTX_FLAGS="-agentx.addr /var/agentx/master -vppcfg /etc/vpp/vppcfg.yaml -vppstats.period 10"
|
||||||
|
|
||||||
|
# Additional options that can be added to GOVPP_SNMP_AGENTX_FLAGS:
|
||||||
|
# -debug Enable debug logging
|
||||||
|
# -agentx.addr host:port SNMPd Agentx address (example: localhost:705)
|
||||||
|
# -vppstats.api.addr PATH VPP API socket path (default: /var/run/vpp/api.sock)
|
||||||
|
# -vppstats.stats.addr PATH VPP stats socket path (default: /var/run/vpp/stats.sock)
|
||||||
|
# -vppstats.ifindex-offset NUM Interface index offset (default: 1000)
|
||||||
|
#
|
||||||
|
# Example with debug logging:
|
||||||
|
# GOVPP_SNMP_AGENTX_FLAGS="-agentx.addr localhost:705 -vppcfg /etc/vpp/vppcfg.yaml -vppstats.period 10 -debug"
|
@ -4,9 +4,10 @@ After=network.target vpp.service
|
|||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
|
EnvironmentFile=-/etc/default/govpp-snmp-agentx
|
||||||
ExecStartPre=-+/usr/bin/chmod 770 /var/agentx /var/agentx/master
|
ExecStartPre=-+/usr/bin/chmod 770 /var/agentx /var/agentx/master
|
||||||
ExecStartPre=-+/usr/bin/chown Debian-snmp:vpp /var/agentx /var/agentx/master
|
ExecStartPre=-+/usr/bin/chown Debian-snmp:vpp /var/agentx /var/agentx/master
|
||||||
ExecStart=/usr/sbin/govpp-snmp-agentx -agentx.addr /var/agentx/master -vppcfg /etc/vpp/vppcfg.yaml -vppstats.period 10
|
ExecStart=/usr/sbin/govpp-snmp-agentx $GOVPP_SNMP_AGENTX_FLAGS
|
||||||
User=Debian-snmp
|
User=Debian-snmp
|
||||||
Group=vpp
|
Group=vpp
|
||||||
ExecReload=/bin/kill -HUP $MAINPID
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
|
@ -2,8 +2,6 @@ module govpp-snmp-agentx
|
|||||||
|
|
||||||
go 1.23.8
|
go 1.23.8
|
||||||
|
|
||||||
toolchain go1.23.10
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/posteo/go-agentx v0.2.1
|
github.com/posteo/go-agentx v0.2.1
|
||||||
go.fd.io/govpp v0.12.0
|
go.fd.io/govpp v0.12.0
|
Reference in New Issue
Block a user