This alters the way rx packets are accounted for by
counting them when they are processed by netdev_dummy_rx_recv(),
which seems to be a common path used by all received packets.

Previously accounting was done earlier, in netdev_dummy_receive(),
however this does not appear to count packets that are received via
a socket.

This resolves packet counting errors reported by the following
OFtest tests:

        port_stats.MultiFlowStats
        port_stats.SingleFlowStats
        pktact.WildcardPriorityWithDelete
        pktact.WildcardPriority

Signed-off-by: Simon Horman <ho...@verge.net.au>
---
 lib/netdev-dummy.c | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index e40c099..061ad0c 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -468,8 +468,15 @@ netdev_dummy_rx_recv(struct netdev_rx *rx_, void *buffer, 
size_t size)
     }
 
     if (packet->size <= size) {
+        struct netdev_dummy *dummy_dev = netdev_dummy_cast(netdev);
+
         memcpy(buffer, packet->data, packet->size);
         retval = packet->size;
+        ovs_mutex_lock(&dummy_dev->mutex);
+        dummy_dev->stats.rx_packets++;
+        dummy_dev->stats.rx_bytes += packet->size;
+        ovs_mutex_unlock(&dummy_dev->mutex);
+
     } else {
         retval = -EMSGSIZE;
     }
@@ -870,8 +877,6 @@ netdev_dummy_receive(struct unixctl_conn *conn,
         }
 
         ovs_mutex_lock(&dummy_dev->mutex);
-        dummy_dev->stats.rx_packets++;
-        dummy_dev->stats.rx_bytes += packet->size;
         netdev_dummy_queue_packet(dummy_dev, packet);
         ovs_mutex_unlock(&dummy_dev->mutex);
     }
-- 
1.8.4

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to