summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKusakabe Si <linux@kskb.eu.org>2021-07-05 17:03:20 +0800
committerOndrej Fabry <ofabry@cisco.com>2021-07-27 13:02:29 +0000
commit24f179dbb9534ed7c05bee2a80f18b55443706ab (patch)
tree43d336e5b0f88f9b33242ef1bd05fb81eaa982a4
parent57de49f7583b8174c7f3d8e21956d4eaac64ac28 (diff)
https://jira.fd.io/browse/GOVPP-21
Signed-off-by: Kusakabe Si <linux@kskb.eu.org> Change-Id: Ib1761e3b93dae70680646ce7fdd78a1168fd0b9f
-rw-r--r--extras/libmemif/adapter.go10
-rw-r--r--extras/libmemif/examples/icmp-responder/icmp-responder.go10
2 files changed, 19 insertions, 1 deletions
diff --git a/extras/libmemif/adapter.go b/extras/libmemif/adapter.go
index eb7e209..ac8a827 100644
--- a/extras/libmemif/adapter.go
+++ b/extras/libmemif/adapter.go
@@ -380,6 +380,7 @@ type Memif struct {
// Interrupt
intCh chan uint8 // memif-global interrupt channel (value = queue ID)
+ intErrCh chan error // triggered when interrupt error occurs
queueIntCh []chan struct{} // per RX queue interrupt channel
// Rx/Tx queues
@@ -585,6 +586,7 @@ func CreateInterface(config *MemifConfig, callbacks *MemifCallbacks) (memif *Mem
// Initialize memif-global interrupt channel.
memif.intCh = make(chan uint8, 1<<6)
+ memif.intErrCh = make(chan error, 1<<6)
// Initialize event file descriptor for stopping Rx/Tx queue polling.
memif.stopQPollFd = int(C.eventfd(0, C.EFD_NONBLOCK))
@@ -667,6 +669,12 @@ func (memif *Memif) GetInterruptChan() (ch <-chan uint8 /* queue ID */) {
return memif.intCh
}
+// GetInterruptErrorChan returns an Error channel
+// which fires if there are errors occurred while read data.
+func (memif *Memif) GetInterruptErrorChan() (ch <-chan error /* The error */) {
+ return memif.intErrCh
+}
+
// GetQueueInterruptChan returns an empty-data channel which fires every time
// there are data to read on a given queue.
// It is only valid to call this function if memif is in the connected state.
@@ -1022,6 +1030,7 @@ func (memif *Memif) Close() error {
if err != nil {
// Close memif-global interrupt channel.
close(memif.intCh)
+ close(memif.intErrCh)
// Close file descriptor stopQPollFd.
C.close(C.int(memif.stopQPollFd))
}
@@ -1163,6 +1172,7 @@ func pollRxQueue(memif *Memif, queueID uint8) {
continue
}
log.WithField("err", err).Error("epoll_wait() failed")
+ memif.intErrCh <- err
return
}
diff --git a/extras/libmemif/examples/icmp-responder/icmp-responder.go b/extras/libmemif/examples/icmp-responder/icmp-responder.go
index 79bb9d0..a7726bf 100644
--- a/extras/libmemif/examples/icmp-responder/icmp-responder.go
+++ b/extras/libmemif/examples/icmp-responder/icmp-responder.go
@@ -399,5 +399,13 @@ func main() {
// Wait until an interrupt signal is received.
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt)
- <-sigChan
+ var intErrch = memif.GetInterruptErrorChan()
+ select {
+ case err = <-intErrch:
+ fmt.Printf("Exit due to interface error: %v\n", err)
+ return
+ case <-sigChan:
+ fmt.Printf("Exit by os.Interrupt")
+ return
+ }
}