https://jira.fd.io/browse/GOVPP-21
[govpp.git] / extras / libmemif / adapter.go
index eb7e209..ac8a827 100644 (file)
@@ -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
                }