Add watchInterfaceEvents() listener
This commit is contained in:
72
src/vpp/vpp_iface.go
Normal file
72
src/vpp/vpp_iface.go
Normal file
@@ -0,0 +1,72 @@
|
||||
// Copyright 2025, IPng Networks GmbH, Pim van Pelt <pim@ipng.ch>
|
||||
|
||||
package vpp
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
"go.fd.io/govpp/api"
|
||||
interfaces "go.fd.io/govpp/binapi/interface"
|
||||
|
||||
"govpp-snmp-agentx/logger"
|
||||
)
|
||||
|
||||
func WatchInterfaceEvents(ch api.Channel) error {
|
||||
logger.Debugf("WatchInterfaceEvents() called - starting interface event monitoring")
|
||||
|
||||
notifChan := make(chan api.Message, 100)
|
||||
|
||||
// subscribe for specific event message
|
||||
logger.Debugf("Subscribing to interface events...")
|
||||
sub, err := ch.SubscribeNotification(notifChan, &interfaces.SwInterfaceEvent{})
|
||||
if err != nil {
|
||||
logger.Debugf("error subscribing to interface events: %v", err)
|
||||
return err
|
||||
}
|
||||
logger.Debugf("Successfully subscribed to interface events")
|
||||
|
||||
// enable interface events in VPP
|
||||
logger.Debugf("Enabling interface events in VPP...")
|
||||
err = ch.SendRequest(&interfaces.WantInterfaceEvents{
|
||||
PID: uint32(os.Getpid()),
|
||||
EnableDisable: 1,
|
||||
}).ReceiveReply(&interfaces.WantInterfaceEventsReply{})
|
||||
if err != nil {
|
||||
logger.Debugf("error enabling interface events: %v", err)
|
||||
return err
|
||||
}
|
||||
|
||||
logger.Debugf("Interface events enabled in VPP, starting event listener goroutine")
|
||||
|
||||
// receive notifications
|
||||
go func() {
|
||||
logger.Debugf("Interface event listener goroutine started")
|
||||
defer func() {
|
||||
logger.Debugf("Interface event listener goroutine shutting down")
|
||||
// disable interface events in VPP
|
||||
err = ch.SendRequest(&interfaces.WantInterfaceEvents{
|
||||
PID: uint32(os.Getpid()),
|
||||
EnableDisable: 0,
|
||||
}).ReceiveReply(&interfaces.WantInterfaceEventsReply{})
|
||||
if err != nil {
|
||||
logger.Debugf("error disabling interface events: %v", err)
|
||||
}
|
||||
|
||||
// unsubscribe from receiving events
|
||||
err = sub.Unsubscribe()
|
||||
if err != nil {
|
||||
logger.Debugf("error unsubscribing from interface events: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
logger.Debugf("Interface event listener waiting for events...")
|
||||
for notif := range notifChan {
|
||||
e := notif.(*interfaces.SwInterfaceEvent)
|
||||
logger.Debugf("interface event: SwIfIndex=%d, Flags=%d, Deleted=%t",
|
||||
e.SwIfIndex, e.Flags, e.Deleted)
|
||||
}
|
||||
logger.Debugf("Interface event listener goroutine ended")
|
||||
}()
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user