[ovs-dev] [tests 07/22] netdev-dummy: Limit receive queue length to 100 packets.

Ben Pfaff blp at nicira.com
Fri Oct 26 00:02:03 UTC 2012


It doesn't seem like a good idea to allow the queue length to grow without
bound, even for a test-only device.

Signed-off-by: Ben Pfaff <blp at nicira.com>
---
 lib/netdev-dummy.c |   11 ++++++++++-
 1 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
index 6aa4084..bfc2997 100644
--- a/lib/netdev-dummy.c
+++ b/lib/netdev-dummy.c
@@ -46,10 +46,14 @@ struct netdev_dev_dummy {
     struct list devs;           /* List of child "netdev_dummy"s. */
 };
 
+/* Max 'recv_queue_len' in struct netdev_dummy. */
+#define NETDEV_DUMMY_MAX_QUEUE 100
+
 struct netdev_dummy {
     struct netdev netdev;
     struct list node;           /* In netdev_dev_dummy's "devs" list. */
     struct list recv_queue;
+    int recv_queue_len;         /* list_size(&recv_queue). */
     bool listening;
 };
 
@@ -133,6 +137,7 @@ netdev_dummy_open(struct netdev_dev *netdev_dev_, struct netdev **netdevp)
     netdev = xmalloc(sizeof *netdev);
     netdev_init(&netdev->netdev, netdev_dev_);
     list_init(&netdev->recv_queue);
+    netdev->recv_queue_len = 0;
     netdev->listening = false;
 
     *netdevp = &netdev->netdev;
@@ -169,6 +174,7 @@ netdev_dummy_recv(struct netdev *netdev_, void *buffer, size_t size)
     }
 
     packet = ofpbuf_from_list(list_pop_front(&netdev->recv_queue));
+    netdev->recv_queue_len--;
     if (packet->size > size) {
         return -EMSGSIZE;
     }
@@ -194,6 +200,7 @@ netdev_dummy_drain(struct netdev *netdev_)
 {
     struct netdev_dummy *netdev = netdev_dummy_cast(netdev_);
     ofpbuf_list_delete(&netdev->recv_queue);
+    netdev->recv_queue_len = 0;
     return 0;
 }
 
@@ -437,9 +444,11 @@ netdev_dummy_receive(struct unixctl_conn *conn,
 
         n_listeners = 0;
         LIST_FOR_EACH (dev, node, &dummy_dev->devs) {
-            if (dev->listening) {
+            if (dev->listening
+                && dev->recv_queue_len < NETDEV_DUMMY_MAX_QUEUE) {
                 struct ofpbuf *copy = ofpbuf_clone(packet);
                 list_push_back(&dev->recv_queue, &copy->list_node);
+                dev->recv_queue_len++;
                 n_listeners++;
             }
         }
-- 
1.7.2.5




More information about the dev mailing list