diff options
author | Kusakabe Si <linux@kskb.eu.org> | 2021-07-05 17:03:20 +0800 |
---|---|---|
committer | Ondrej Fabry <ofabry@cisco.com> | 2021-07-27 13:02:29 +0000 |
commit | 24f179dbb9534ed7c05bee2a80f18b55443706ab (patch) | |
tree | 43d336e5b0f88f9b33242ef1bd05fb81eaa982a4 | |
parent | 57de49f7583b8174c7f3d8e21956d4eaac64ac28 (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.go | 10 | ||||
-rw-r--r-- | extras/libmemif/examples/icmp-responder/icmp-responder.go | 10 |
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 + } } |